我有一个Node js程序,但是我很难理解如何在一个变量中将响应细节加在一起。
让我解释一下我的意思:
我有不同的URL,我同时对所有这些URL进行请求(它需要同时)。
我得到的回复有所不同,具体取决于网址结尾 - 回复可以是Dog-List
或Cat-List
然后我需要从Dog-list
获取信息,因此我有if语句说如果响应包含Dog-List
,则打印出“狗列表”并运行所需的代码
如果是Cat-List
,请在“猫列表”中打印并运行所需的代码。
最后,获取狗和猫的信息并将它们连接在一起形成一个变量。
这是代码:
var urls = ['http://111.1:1111/cats', 'http://111.1:1111/dogs'];
function test() {
async.map(urls, function(url, cb) {
request.get(url, function(error, response, body) {
if (error) {
console.log(error);
} else {
parseString(body, function(result) {
var age1 = 0;
var age2 = 0;
if (result.Return['Cat-List']) {
console.log('in cat list');
age1 = result.Return['Cat-List'].age;
} else if (result.Return['Dog-List']) {
console.log('in dog list');
age2 = result.Return['Dog-List'].age;
}
data = age1 + age2;
console.log(data);
});
}
});
});
}
但是,正如您所期望的那样,因为我在从每个URL获得响应后使用了“if”语句,所以我只会进入狗或猫列表,因此我的结果永远无法合并。
这是我运行程序时打印的内容:
in cat list
2
in dog list
3
这是因为猫的年龄是2岁,而狗的年龄是5岁。
这就是我希望cmd看起来像:
in cat list
in dog list
5
在不使用if语句的情况下,有不同的方法吗?或者只是做其他事情一起加入结果?我只是在努力达到这个结果。任何帮助将不胜感激!
答案 0 :(得分:0)
如果您想在任何地方使用data
值,那么您需要使用以下内容运行回调:
cb(null, data);
null
表示没有错误。
你还需要另一个回调作为async.map
的参数,以便在完成所有操作时调用:
function test() {
async.map(urls, function (url, cb) {
// code to run for every value
},
function (err, results) {
// code to run after everything is finished
// here you can sum the results
});
}
有关详细信息,请参阅:
完整示例 - 未经测试:
var urls = ['http://111.1:1111/cats', 'http://111.1:1111/dogs'];
function test() {
async.map(urls, function (url, cb) {
request.get(url, function(error, response, body) {
if (error) {
console.log(error);
} else {
parseString(body, function(result) {
var age = 0;
if (result.Return['Cat-List']) {
console.log('in cat list');
age = result.Return['Cat-List'].age;
} else if (result.Return['Dog-List']) {
console.log('in dog list');
age = result.Return['Dog-List'].age;
}
cb(null, age);
});
}
});
}, function (err, results) {
var sum = results.reduce((a, b) => a + b, 0);
console.log(sum);
});
}