我不是node和async.js的专家。期待来自node js社区的帮助。所以这是我的场景,我想一个接一个地做3个操作,每个都取决于以前的结果。通过使用以前的结果,我需要调用异步函数来检索另一个结果。所以我决定选择异步瀑布。 (希望我选择了正确的)。
async.waterfall([
function(callback) {
request({
method: 'GET',
headers: {'Content-Type' : 'application/json'},
url : url
},function(error, response, body){
if(error) {
callback(error);
} else {
var result= JSON.parse(body);
callback(null,result); //sending to next function
}
});
},
function(result, callback) {
//here i want to use the result array in loop async.eachSeries or forEachSeries and fetch another result array using request module then send it to next function
/*Here I don't know How to process the result*/
callback(null,result1)
},
function(result1, callback) {
//here i want to use the result1 array and fetch another result array then send it to next function
callback(null,result2)
}
], function(error, res) {
console.log(res); // process final result
});
我提到了一些教程。我无法理解这就是为什么最终会在这里结束。提前谢谢。
答案 0 :(得分:2)
你只是必须使用瀑布函数系列中每个函数传入的每个cb。
是的,我觉得被迫说:好的,对waterfall
函数来说,语义基本上需要以下语法:
async.waterfall(arrayOfFunctions, [optionalResolveCallbackFunction]);
函数数组中的第一个元素具有以下语法:
function (cb) {...};
以下n个函数将需要以下语法:
function (param1, param2, ... paramN, cb){...}
因此,最后一个参数将是用于转到下一个函数或返回错误的参数。 瀑布参数的数量是可选的。
每个cb
函数都遵循错误回调约定,其中error是要传递的第一个参数。如果在数组中的任何函数返回错误,执行将被中断,代码将持续到optionalResolveCallbackFunction
。
因此,当您决定终止循环async.eachSeries或forEachSeries时,即使这会产生复杂的代码(甚至容易出现性能问题的风险),您将使用callback
对象恰好是瀑布函数的回调参数传递给跟随函数或结束执行。
答案 1 :(得分:2)
这是一个如何运作的例子:
async.waterfall([
function(callback) {
request({
method: 'GET',
headers: {
'Content-Type': 'application/json'
},
url: url
}, function(error, response, body) {
if (error) {
callback(error);
} else {
var result = JSON.parse(body);
callback(null, result); //sending to next function
}
});
},
function(result, callback) {
//here i want to use the result array in loop async.eachSeries or forEachSeries and fetch another result array using request module then send it to next function
async.each(result, function(item, callback) {
request({
method: 'GET',
headers: {
'Content-Type': 'application/json'
},
url: url
}, function(error, response, body) {
if (error) {
callback(error);
} else {
var result = JSON.parse(body);
callback(null, result);
}
});
}, function(err, result1) {
if (!err) {
callback(null, result1);
} else {
callback(err);
}
});
},
function(result1, callback) {
request({
method: 'GET',
headers: {
'Content-Type': 'application/json'
},
url: url
}, function(error, response, body) {
if (error) {
callback(error);
} else {
var result2 = JSON.parse(body);
callback(null, result2);
}
});
}
], function(error, res) {
console.log(res); // process final result
});
答案 2 :(得分:1)
当功能调用失败时,您应该返回以确保您没有进入下一步:
function(callback) {
request({
method: 'GET',
headers: {'Content-Type' : 'application/json'},
url : url
},function(error, response, body){
if(error) {
return callback(error);
} else {
var result= JSON.parse(body);
callback(null,result); //sending to next function
}
});
},
第二个函数中的结果参数是从第一次调用返回的数组。
function(result, callback) {
//here i want to use the result array in loop async.eachSeries or forEachSeries and fetch another result array using request module then send it to next function
/*Here I don't know How to process the result*/
for (var i in result) {
...
}
callback(null,result1)
},
然后对系列中的下一个函数
进行相同的操作