根据最新响应在Node中发送同步请求

时间:2015-01-20 21:08:08

标签: javascript node.js asynchronous

我在我的节点服务器上使用async模块来遍历我的mongodb数据库中的对象,根据每个对象内的数据触发对Instagram API的请求,并增加{{1在每次迭代中,直到达到minTimestamp

除了一个大问题之外,下面的代码效果很好。如果我将endTimestamp增加一个硬编码值(minTimestamp),一切都运行良好。但是,当我更改一行代码以从最近的响应(minTimestamp += 1000)中获取最新的created_time时,我的循环会针对每个事件运行一次'然后停下来。我得到了正确的增加minTimestamp = images[0].created_time登录到我的控制台,但值似乎永远不会进入下一个循环。

minTimestamp

1 个答案:

答案 0 :(得分:1)

如果你有一个我可以看的git repo,我可以更好地调试这个,但是...那说,我看到两个明显的问题:

  1. 虽然您正在执行async.eachSeries,但您还没有等到完成findOneAndUpdate调用。
  2. 你的例子:

    Event.findOneAndUpdate( {}, {},
        function(err, model) {
            console.log(err);  
        }
    );
    imageFinishedCallback();
    

    应该变成这个:

    Event.findOneAndUpdate( {}, {},
        function(err, model) {
            console.log(err);  
            imageFinishedCallback();
        }
    );
    
    1. 与第一个问题类似,但使用async.whilst回调。您正在调用async.eachSeries,但随后会立即转到下一个循环。
    2. 您的代码:

      function (error, response, body) {
          // ...
          async.eachSeries(images, function(image, imageFinishedCallback) {/* ... */},
          function(err){
              // ...
          });
      
          // this works
          minTimestamp += 1000;
          // this does not
          // minTimestamp = images[0].created_time;
          if (numImages > 0) {
              console.log(numImages + 'images have been processed successfully and min_timestamp has been incremented to: ' + minTimestamp);
          }
          requestFinishedCallback();
      }
      

      应改为:

      function (error, response, body) {
          // ...
          async.eachSeries(images, function(image, imageFinishedCallback) {/* ... */},
          function(err){
              // ...
              console.log(numImages + 'images have been processed successfully and min_timestamp has been incremented to: ' + minTimestamp);
              minTimestamp = images[0].created_time;
              requestFinishedCallback();
          });
      }
      

      如果你有一个github repo来发布我可以进一步调试,但是......看起来问题来自不等待异步函数完成。