gpt4 book ai didi

node.js - Nodejs async.waterfall 方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:59 25 4
gpt4 key购买 nike

更新2

完整代码 list

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'
});

更新:

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

  1. 连接到端点并获取身份验证 key - 将身份验证 key 传递到步骤 2
  2. 使用身份验证 key 连接到端点并获取 JSON 结果 - 创建一个包含摘要结果的对象并传递到步骤 3。
  3. 迭代传递的对象摘要结果,并为对象中的每个项目调用 API,以获取每个摘要行的详细信息
  4. 创建一个包含摘要和详细信息的 JSON 数据结构。

下面的原始问题概述了我迄今为止所尝试的内容!

原始问题:

async.waterfall方法支持多个回调吗?

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

例如,

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 。在你的情况下,我只能看到你需要在一个回调中使用所有 api 调用的结果。由于您还想创建一个新数组,因此我将使用 async.map。

更新:

如果你想在 async.waterfall 中创建循环,async.each/map 是首选武器。下面的代码将在调用每个 dns 时调用 waterfall 回调。

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> }]
});

关于node.js - Nodejs async.waterfall 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17337994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com