Nodejs同步对于每个循环

我想为每个循环做一个,但它有同步运行。 循环的每一次迭代都会执行一个http.get调用,并将返回json以将值插入到数据库中。 问题是,for循环asynchronous运行,并导致所有的http.gets一次运行,我的数据库不会最终插入所有的数据。我使用async-foreach来尝试做我想做的这样做,但我不必用它,如果我能以正确的方式做到这一点。

mCardImport = require('m_cardImport.js'); var http = require('http'); app.get('/path/hi', function(req, res) { mCardImport.getList(function(sets) { forEach(sets, function(item, index, arr) { theUrl = 'http://' + sets.set_code + '.json'; http.get(theUrl, function(res) { var jsonData = ''; res.on('data', function(chunk) { jsonData += chunk; }); res.on('end', function() { var theResponse = JSON.parse(jsonData); mCardImport.importResponse(theResponse.list, theResponse.code, function(theSet) { console.log("SET: " + theSet); }); }); }); }); }); }); 

和我的模型

 exports.importResponse = function(cardList, setCode, callback) { mysqlLib.getConnection(function(err, connection) { forEach(cardList, function(item, index, arr) { var theSql = "INSERT INTO table (name, code, multid, collector_set_num) VALUES " + "(?, ?, ?, ?) ON DUPLICATE KEY UPDATE id=id"; connection.query(theSql, [item.name, setCode, item.multid, item.number], function(err, results) { if (err) { console.log(err); }; }); }); }); callback(setCode); }; 

recursion代码非常干净。 等待http响应返回,然后发起下一次尝试。 我不认为每个人都是最好的方法。

 var urls = ['http://stackoverflow.com/', 'http://security.stackexchange.com/', 'http://unix.stackexchange.com/']; var processItems = function(x){ if( x < urls.length ) { http.get(urls[x], function(res) { // add some code here to process the response processItems(x+1); }); } }; processItems(0); 

为了循环和同步链接asynchronous操作,最简洁的解决scheme可能是使用承诺库(承诺正在ES6中引入,这是要走的路)。

使用蓝鸟 ,这可能是

 Var p = Promise.resolve(); forEach(sets, function(item, index, arr) { p.then(new Promise(function(resolve, reject) { http.get(theUrl, function(res) { .... res.on('end', function() { ... resolve(); } })); }); p.then(function(){ // all tasks launched in the loop are finished }); 

我发现在每次调用完成之后,我并没有发布我的mysql连接,而这会造成连接失败,并显示出同步问题。

显式调用connection.release(); 它使我的代码以asynchronous方式正确工作。

感谢那些发布到这个问题的人。

 "use strict"; var Promise = require("bluebird"); var some = require('promise-sequence/lib/some'); var pinger = function(wht) { return new Promise(function(resolve, reject) { setTimeout(function () { console.log('I`ll Be Waiting: ' + wht); resolve(wht); }, Math.random() * (2000 - 1500) + 1500); }); } var result = []; for (var i = 0; i <= 12; i++) { result.push(i); } some(result, pinger).then(function(result){ console.log(result); });