Tag: asynchronous

NodeJS和mysql:等待查询结果

我有一个用nodejs + express做的小项目,我也做了一些小的服务,在它的某些页面上共享。 var mysql = require('mysql'); var pool = mysql.createPool({ connectionLimit : 100, host : 'host', user : 'user', password : 'password', database : 'database', debug : false }); function executeQuery(query, callback) { pool.getConnection(function (err, connection) { if (err) { return callback(err, null); } else if (connection) { connection.query(query, function (err, rows, fields) { […]

Async.jsdevise模式

我正在为我的node.js应用程序使用async.js。 我需要帮助解决以下问题。 假设我有一个以下的aysnc js系列函数。 async.waterfall([ function getDataFromDB(request, response, callback){ … }, function someOperationOnDBData(dbData, response, callback){ … }, function renderSomeFlow(evaluatedData, response, callback){ … } ]); 我有三个函数按上面提到的顺序调用。 我从getDataFromDB获取数据并传递给someOperationOnDBData等。 假设我需要getDataFromDB和someOperationOnDBData之间的一个更多的操作,但仍然向前传递DBData。 例如: async.waterfall([ function getDataFromDB(request, response, callback){ … }, function extraOperation(dbData, response, callback) {…} function someOperationOnDBData(dbData, extraOperationData, response, callback){ … }, function renderSomeFlow(evaluatedData, response, callback){ … } ]); 这里在中间添加一个单独的步骤会改变函数的定义,而且我需要在dbData中传递extraOperation来将它转发给someOperationOnDBData […]

将函数数组传递给asynchronous并行

我必须传递一个函数数组到node.js的async.js模块。 从文档的正常方式将是: async.parallel([ function(callback){ setTimeout(function(){ callback(null, 'one'); }, 200); }, function(callback){ setTimeout(function(){ callback(null, 'two'); }, 100); }, ], // optional callback function(err, results){ }); 我试过这样的: for(var i = 0; i < jsonData.length; i++) { … o.url = serviceurl; o.title = jsonData[i]; var ff = function(callback){ obj.loadService(o.title,o.url,callback); } callItems.push(ff(function(){return true;})); } async.parallel( callItems, // optional callback […]

使用asynchronous和请求模块限制请求

我将asynchronous和请求模块组合在一起,以asynchronous方式和速率限制来发出api请求。 这是我的代码 var requestApi = function(data){ request(data.url, function (error, response, body) { console.log(body); }); }; async.forEachLimit(data, 5, requestApi, function(err){ // do some error handling. }); 数据包含我要求的所有url。 我使用forEachLimit方法将并发请求的数量限制为5。 这段代码会使第5个请求停止。 在asynchronous文档中,它说:“迭代器传递一个callback函数,一旦完成,就必须调用它”。 但是我不明白,我该怎么做来表示请求已经完成?

Node.jsasynchronous文件I / O

我是Node.js的新手,最近了解了fs模块。 我对asynchronous和同步文件I / O有点困惑。 考虑以下testing: var fs = require('fs'); var txtfile = 'async.txt'; var buffer1 = Buffer(1024); var buffer2 = '1234567890'; fs.appendFile(txtfile, buffer1, function(err) { if (err) { throw err }; console.log('appended buffer1'); }); fs.appendFile(txtfile, buffer2, function(err) { if (err) { throw err }; console.log('appended buffer2'); }); 大约一半的时候,我运行这个,它打印appended buffer2之前appended buffer1 。 但是,当我打开文本文件时,数据总是显示正确的顺序 – 从Buffer(1024)然后是1234567890一堆垃圾。 我会期待相反或混乱的混乱。 […]

如何在JavaScript中testing基于生成器的stream量控制(ES6)?

如何让Mocha等到asynchronousfunction完成? 模 var fs = require('mz/fs'); var co = require('co'); module.exports = new filecache(); function filecache () { var self = this; var storage = storage || {}; self.cache = co(function* (filePath, fileName) { if (yield fs.exists(filePath)) { storage[fileName] = yield fs.readFile(filePath); } }); self.has = function has (fileName) { return storage.hasOwnProperty(fileName); }; } testing(摩卡) […]

从node.js到外部系统的并行请求的增加需要更多的时间来响应

我有一个简单的情况,我正在从我的node.js服务器请求不同的上游代理服务器。 随着负载的增加,我看到请求花了很多时间来执行(尽pipe从我的上游代理服务器响应的时间在请求中是恒定的)。 为了演示这个问题,我写了一个示例程序如下。 当我执行下面的程序,第一个请求需要118毫秒执行和最后一个需要10970毫秒取决于你打的网站(我已经改变了url为谷歌,试试你最喜欢的网站)。 如果您观察到我正在使用asynchronous并发我的请求。 问题是 ,node.js在并行运行时需要花费这么多时间执行请求的原因是什么? 为了给出更多的背景设置(centos 6.5),我已经打开了我的端口范围,从1024到65535,将fin_timeout改为15秒,并为sysctl.conf中的套接字启用tw_reuse = 1 var http = require('http'); var uuid = require('node-uuid'); var async = require('async'); function callExternalUrl(){ var uniqueId = uuid.v4(); console.time(uniqueId); var options = { host: 'google.com', port: '80', path: '/', method: 'GET' }; var req = http.request(options, function(res) { var msg = ''; res.setEncoding('utf8'); res.on('data', […]

在顺序HTTP请求阻止操作在节点?

请注意,对我的问题不相关的信息将被“引用” 像这样(随意跳过这些)。 问题 我正在使用节点代表多个客户端进行按顺序的HTTP请求。 这样,最初拿客户端几个不同的页面加载得到所需的结果,现在只通过我的服务器采取一个单一的请求。 我目前正在使用“asynchronous”模块进行stream量控制和“请求”模块进行HTTP请求。 大约有5个callback,使用console.time,从开始到结束需要大约2秒(草图代码如下)。 现在我对节点不熟悉,但是我知道节点的单线程本质。 虽然我已经多次阅读了这个节点,并不是为CPU绑定的任务而构build的,但是我直到现在才真正理解这个意思。 如果我对所发生的事情有正确的理解,这就意味着我目前所拥有的(在开发中)决不会超过10个客户。 题 因为我不是节点的专家, 所以我问这个问题(在标题中)来得到确认,使得几个连续的HTTP请求确实阻塞。 结语 如果是这样的话,我希望我会问一个不同的SO问题(在做适当的研究之后)讨论各种可能的解决scheme,如果我select继续在节点中处理这个问题(这本身可能不适合我正在尝试的去做)。 其他闭幕的想法 如果这个问题不够详细,太不清白,或者特别花言巧语(我尽量简洁),我真的很抱歉。 感谢和所有的人都可以帮助我的问题! 我之前提到的代码: var async = require('async'); var request = require('request'); … async.waterfall([ function(cb) { console.time('1'); request(someUrl1, function(err, res, body) { // load and parse the given web page. // make a callback with data parsed from the web […]

使用async / await + Bluebird来promisifyAll

我正在构build一个使用async / await的库,我想知道是否有可能像使用async / await一样使用fs这样的本地模块。 我知道asynchronous/等待它只是在后台承诺,所以…是否有本地方式promisify一个方法或function? 目前,我正在使用蓝鸟,但我不知道这是不是一个坏模式。 例: const Bluebird = require("bluebird"); const { access } = require("fs"); const accessAsync = Bluebird.promisify(access); async function checkInput(options) { await accessAsync(options.file); /// etc return options; } module.exports = (options) => { Promise.resolve(options) .then(checkInput) }; 我结合了原生Promises和Bluebird。 我应该只使用蓝鸟吗? 谢谢。

如何等待函数或数据库查询? 然后处理结果并最终将其发回

我有这种情况: app.get('/', async function (request, response) { await foo(DbConnection).then((result) => console.log("response ready")); }) let foo = async function (DbConnection) { const myQuery = "SELECT * FROM my_table"; DbConnection.query(myQuery, async function(err, results) { console.log("query ready"); await bar(results).then((response) => console.log("bar done")) }) return; // go back to app.get() to send stuff to client } let bar = […]