【问题标题】:Issue with forEach loop over array performing HTTP POST request on each object对每个对象执行 HTTP POST 请求的数组上的 forEach 循环出现问题
【发布时间】: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


【解决方案1】:

我能够通过创建一个单独的数组来比较我正在循环执行异步请求的数组的长度来解决这个问题。当新数组达到与我循环的数组相同的长度时,我就能够存储数据。感谢您的所有帮助!

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 2016-03-17
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多