我有一个程序必须遍历一个数组,然后发布它并获取数据。例如。
数组如下。
var fruits = ["apple","banana","mango","orange","carrot"]
我有一个网址如下。
var url ="https://www.fruitsdatabase.com/fruitNames"
我想发布数据。我正在使用以下代码。
for (var i in fruits) {
var uhri = "https://www.fruitsdatabase.com/fruitNames";
var options = {
uri: uhri,
method: 'POST',
json: {
"type": "fruits",
"params": {
"name": fruits[i]
}
}
};
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
if (body) {
console.log(fruits[i] + "\t" + body);
} else {
console.log('sorry no results found');
}
} else {
console.log("Wow this is an err");
}
});
}
当我试图打印时,我得到的结果看起来像这样。
apple [object, object]
banana [object, object]
mango [object, object]
orange [object, object]
carrot [object, object]
当我将console.log(fruits[i] + "\t" + body);
更改为console.log(body);
{
Table1:
[ { Name: 'apple',
type: 'fruit',
color: 'green',
}
]
}
{
Table1:
[ { Name: 'banana',
type: 'fruit',
color: 'yellow',
}
]
}
{
Table1:
[ { Name: 'mango',
type: 'fruit',
color: 'yellow',
}
]
}
{
Table1:
[ { Name: 'orange',
type: 'fruit',
color: 'orange',
}
]
}
{}
因为胡萝卜不是水果,它应该返回{}
并且在上面的代码中而不是打印carrot [object, object]
,它应该打印carrot sorry no results found
。请让我知道我哪里出错了,我该怎么办呢。
由于
答案 0 :(得分:0)
您的代码中的问题是您正在执行请求并在for循环中获取回调!
for
循环不会等待request
函数完成并调用回调,因此您要创建另一个函数,并发送i
和fruits[i]
{}和回调参数(error, response, body)
将不匹配,这就是你得到意外行为的原因。
你可以做很多解决方案
1 - 创建额外的功能来处理这个问题:
function sendRequest(options){ // additonal function
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
if (body) {
console.log(options.json.params.name + "\t" + body);
} else {
console.log('sorry no results found');
}
} else {
console.log("Wow this is an err");
}
});
}
for (var i in fruits) {
var uhri = "https://www.fruitsdatabase.com/fruitNames";
var options = {
uri: uhri,
method: 'POST',
json: {
"type": "fruits",
"params": {
"name": fruits[i]
}
}
};
sendRequest(options)
}
2 - 使用async
模块使用async.parallel
调用由Array.protorype.map()
创建的一系列功能。
var async = require('async')
var fruitsFuncs = fruits.map(function(fruit){
return function(fn){
var uhri = "https://www.fruitsdatabase.com/fruitNames";
var options = {
uri: uhri,
method: 'POST',
json: {
"type": "fruits",
"params": {
"name": fruit
}
}
}
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
if (body) {
console.log(fruit + "\t" + body);
} else {
console.log('sorry no results found');
}
} else {
console.log("Wow this is an err");
}
fn(error,body);
});
}
})
async.parallel(fruitsFuncs,function(err,results){
console.log('Finished All')
});