node.js:如何在forEach循环中实现一个带有异步调用的路由方法
node.js: how to implement a routing method with an async call inside a forEach loop?
我必须实现这样的逻辑:
var express = require('express'),
request = require('request');
var array = [
{ url: 'http://www.example1.com' },
{ url: 'http://www.example2.com' },
];
express.Router().get('/job', function (req, res) {
results = [];
array.forEach(function (item) {
request(item.url, function (error, response, body) {
if (!error && response.statusCode == 200) {
results.push(body);
}
});
res.json(results); // <== wrong, results array is empty, here...
});
我如何调用res.json(结果)确保forEach循环结束?
UPDATE:它是不是建议答案的副本!
当所有请求完成时,我需要res.json(),当forEach循环完成时,不是…: - (
有一个简单的方法:
var express = require('express'),
request = require('request');
var array = [
{ url: 'http://www.example1.com' },
{ url: 'http://www.example2.com' },
];
//store number of completed calls
var completed = 0;
express.Router().get('/job', function (req, res) {
results = [];
array.forEach(function (item) {
request(item.url, function (error, response, body) {
if (!error && response.statusCode == 200) {
results.push(body);
completed = completed + 1; //iterate counter
onComplete(); //attempt completion
}
});
function onComplete(){
if(completed != array.length) {
return;
}
res.json(results);
// ... rest of code that relies on results
};
});
您可以使用asnyc
series
来实现这一点。像这样:
var express = require('express'),
request = require('request');
async = require('async);
…
async.series([
function(callback) {
request('http://www.example1.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
callback(null, body);
}
});
},
function(callback) {
request('http://www.example2.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
callback(null, body);
}
});
}
], function(err, res) {
res.json(res);
});
你应该使用承诺!(这个例子适用于最新版本的node,因为它支持原生承诺)
var arrayPromises = [];
array.forEach(function (item) {
arrayPromises.push(new Promise(function(resolve, reject) {
request(item.url, function (error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}else{
resolve();
}
});
}));
});
Promise.all(arrayPromises).then(function(results){
res.json(results);
});
相关文章:
- 将其中一个异步方法重写为使用promise的方法
- Meteor:如何遍历一个数组,这是一个异步方法的结果
- 如何将异步方法返回的值发送到javascript中的另一个异步方法
- 在执行另一个异步函数之前,只有当条件为true时,才执行某些异步函数的最佳方法
- 等待上一个异步函数完成
- node.js:将一个异步函数列表应用于列表列表中的每一项
- 等待一个异步函数在Node.js中返回
- 另一个异步循环中的Javascript异步循环
- 如何在另一个异步`each`方法(NodeJS)内部进行异步方法调用
- 如何在nodejs中将参数从一个异步函数传递到另一个
- 为什么我不需要在Sails.js控制器函数中调用next,即使它在其主体中有一个(异步的?)数据库查询
- Javascript在另一个异步函数结束时调用函数
- 我如何知道最后一个异步函数何时在ob" for键中返回结果?循环
- 如何以组的方式调用一个异步函数?
- 确保两个函数一个接一个地执行,其中第一个函数内部有一个异步调用
- JS磁带-等待前一个异步测试完成,以移动到下一个测试
- 在javascript中使用for循环创建一个异步获取序列
- 如何用Meteor创建一个异步RESTful接口
- dispatchEvent是一个同步函数还是一个异步函数?
- 在Firebase节点客户端中,是一个异步函数