【发布时间】:2017-03-12 09:35:31
【问题描述】:
我正在使用 npm 请求模块对 API 执行超级基本的 POST 请求,以上传图像 url 并为 url 数组中的每个对象获取一个新的 url 链接。一旦我拥有它们,我会将它们推回我的阵列中。
我似乎无法完成这项工作。当我通过常规字符串执行它时,我可以让它正常工作,但是当我尝试在数组上循环 http POST 请求时,我无法让它返回。
我有一个数组,例如:
var product = {
extra_images:
[ 'https://some.imgcdn.com/myimage1.jpg',
'https://some.imgcdn.com/myimage2.jpg',
'https://some.imgcdn.com/myimage3.jpg' ]
}
product.extra_images.forEach(function(originURL, index){
urlCloaker(originURL, extraImgResponse);
});
这是执行对 API 的请求的函数:
function urlCloaker(imgUrl, cloakedURLResponse){
var imgUrl = 'upload=' + imgUrl;
request('http://coolsite.com/api?' + imgUrl, function (error, response, body) {
if(error){
return console.log('Error:', error);
}
if(response.statusCode !== 200){
return console.log('Invalid Status Code Returned:', response.statusCode);
}
else {
var JSON_result = JSON.parse(body);
cloakedURLResponse(error, JSON_result.data.img_url);
}
});
}
这是我的回调:
function extraImgResponse(err, data){
if(err)
console.log("ERROR: " , err);
else {
product.extra_images.push(data);
}
}
【问题讨论】:
-
I cant get it to return- 你不能得到什么回报?你期望你的代码的结果是什么? -
我怀疑您认为
product.extra_images会在product.extra_images.forEach(function ...)之后立即被修改 - 当然,因为urlCloaker是异步的,不能立即发生 -
extraImgResponse(err, data) 该函数何时被准确调用,您是否也在使用 Promise?
-
我没有使用承诺,只是常规回调。我添加了一个单独的数组来将每个循环数据推送到其中,然后将此数组长度与源数组长度进行比较。当它们都达到相同的长度时,循环应该停止。当我这样做时......我现在能够获得索引 1、2 的循环,但 0 被跳过了。
-
它被跳过的原因是因为http请求不是同步的,所以你必须等待它们返回。我建议使用承诺/链接。回调很快就会失控。
标签: javascript arrays node.js asynchronous