nodejs async.waterfall方法

更新2

完整的代码清单

var request = require('request'); var cache = require('memory-cache'); var async = require('async'); var server = '172.16.221.190' var user = 'admin' var password ='Passw0rd' var dn ='\\VE\\Policy\\Objects' var jsonpayload = {"Username": user, "Password": password} async.waterfall([ //Get the API Key function(callback){ request.post({uri: 'http://' + server +'/sdk/authorize/', json: jsonpayload, headers: {'content_type': 'application/json'} }, function (e, r, body) { callback(null, body.APIKey); }) }, //List the credential objects function(apikey, callback){ var jsonpayload2 = {"ObjectDN": dn, "Recursive": true} request.post({uri: 'http://' + server +'/sdk/Config/enumerate?apikey=' + apikey, json: jsonpayload2, headers: {'content_type': 'application/json'} }, function (e, r, body) { var dns = []; for (var i = 0; i < body.Objects.length; i++) { dns.push({'name': body.Objects[i].Name, 'dn': body.Objects[i].DN}) } callback(null, dns, apikey); }) }, function(dns, apikey, callback){ // console.log(dns) var cb = []; for (var i = 0; i < dns.length; i++) { //Retrieve the credential var jsonpayload3 = {"CredentialPath": dns[i].dn, "Pattern": null, "Recursive": false} console.log(dns[i].dn) request.post({uri: 'http://' + server +'/sdk/credentials/retrieve?apikey=' + apikey, json: jsonpayload3, headers: {'content_type': 'application/json'} }, function (e, r, body) { // console.log(body) cb.push({'cl': body.Classname}) callback(null, cb, apikey); console.log(cb) }); } } ], function (err, result) { // console.log(result) // result now equals 'done' }); 

更新:

我正在构build一个小型应用程序,需要对外部API进行多个HTTP调用,并将结果合并到一个对象或数组中。 例如

  1. 连接到terminal并获得授权密钥 – 将授权密钥传递到步骤2
  2. 使用身份validation键连接到端点并获取JSON结果 – 创build一个包含汇总结果的对象并传递到步骤3。
  3. 迭代传递的对象摘要结果,并调用对象中每个项目的API以获取每个摘要行的详细信息
  4. 创build一个包含摘要和详细信息的单个JSON数据结构。

下面的原始问题概述了迄今为止我尝试过的东西!

原问题:

async.waterfall方法是否支持多个callback?

即遍历从链中的前一个项传递的数组,然后调用多个http请求,每个请求都有自己的callback。

例如,

 sync.waterfall([ function(dns, key, callback){ var cb = []; for (var i = 0; i < dns.length; i++) { //Retrieve the credential var jsonpayload3 = {"Cred": dns[i].DN, "Pattern": null, "Recursive": false} console.log(dns[i].DN) request.post({uri: 'http://' + vedserver +'/api/cred/retrieve?apikey=' + key, json: jsonpayload3, headers: {'content_type': 'application/json'} }, function (e, r, body) { console.log(body) cb.push({'cl': body.Classname}) callback(null, cb, key); }); } } 

希望我能正确理解你的问题。 在我看来,你想调用dns每个项目的API,并需要知道什么时候完成。 当你有一个函数链使用前面的函数的结果时,通常使用async.waterfall。 在你的情况下,我只能看到你需要在一个callback中使用所有API调用的结果。 而且,既然你也想创build一个新的数组,我会使用async.map。

更新:

如果你想在一个async.waterfall中做一个循环,async.each / map是你select的武器。 当每个dns被调用时,下面的代码将调用瀑布callback。

 async.waterfall([ // ..., function(dns, apikey, callback){ async.map(dns, function (item, next) { var jsonpayload3 = { Cred: dns[i].DN, Pattern: null, Recursive: false }; request.post({ uri: 'http://' + vedserver +'/api/cred/retrieve?apikey=' + key, json: jsonpayload3, headers: {'content_type': 'application/json'} }, function (e, r, body) { next(e, { cl: body.Classname }); }); }, callback); }], function (err, result) { // result now looks like [{ cl: <body.Classname> }] });