2015-07-10 38 views
1

我有一系列从解码折线返回的经度/纬度对。推迟执行node.js中的异步消息传递函数

使用forEach我提取每个纬度/经度对和使用pubnub.publish(),发送这个数据到一个通道。

pubnub.publish()是一个异步函数,我需要在每个步骤通过forEach循环来延迟发布消息。

我已经浏览了很多关于setTimeout立即执行的答案,并尝试了下面的不同版本,包括不在封闭中封装setTimeout,但无法延迟发布 - 只是尽快将它们全部发送它可以。

任何人都可以指出任何明显的错误?

decodedPolyline.forEach(function (rawPoints) { 

    var value = { 
     lat: rawPoints[0], 
     lng: rawPoints[1] 
    }; 

    var sendmsg = function() { 
     pubnub.publish({ 
      channel: id, 
      message: value, 
      callback: function (confirmation) { 
       console.log(confirmation); 
      }, 
      error: function (puberror) { 
       console.log('error: ' + puberror); 
      } 
     }); 
    }; 

    (function() { 
     setTimeout(sendmsg, 2000); 
    })(); 

    normalised.push(value); 
}); 
+0

您是否试图在每次调用'pubnub.publish'之间获得2秒的延迟?现在,您的代码将来会将所有内容排队等待2秒钟,所以它们都会在2秒后大致同时执行。 – nderscore

+0

@aframe问题看起来像一个一致的消息队列的经典实现。 –

+0

@nderscore - 我试图每两秒发布一次,是的。被接受的答案完成了这项工作。 – aframe

回答

2

foreach循环将在接近实时地执行,这意味着所有超时将完成几乎完全在同一时间,你应该在每次迭代2000年增加超时值;或许这对你的作品:

var sendmsg = function (value) { 
    pubnub.publish({ 
     channel: id, 
     message: value, 
     callback: function (confirmation) { 
      console.log(confirmation); 
     }, 
     error: function (puberror) { 
      console.log('error: ' + puberror); 
     } 
    }); 
}; 

var timeoutVal = 2000; 
decodedPolyline.forEach(function (rawPoints) { 

    var value = { 
     lat: rawPoints[0], 
     lng: rawPoints[1] 
    }; 

    (function(value) { 
     setTimeout(function() { 
      sendmsg(value); 
     }, timeoutVal); 
    })(value); 

    //Add 2 seconds to the value so the next iteration the timeout will be executed 2 seconds after the previous one. 
    timeoutVal = timeoutVal + 2000; 

    normalised.push(value); 
}); 

我也感动了sendmsg函数的定义外循环。我相信如果你不为每次迭代定义函数,它会更有性能。希望这可以帮助。