延迟在node.js中执行异步消息传递功能

时间:2015-07-10 16:33:11

标签: javascript node.js asynchronous closures pubnub

我有一系列从解码折线返回的lat / lng对。

使用Resolved Bug我提取每个lat / lng对并使用forEach,将此数据发送到频道。

pubnub.publish()是一个异步函数,我需要在pubnub.publish()循环的每一步都延迟发布消息。

我已经查看了很多关于setTimeout立即执行的答案并尝试了下面的不同版本,包括不将forEach包装在一个闭包中,但是我无法延迟发布 - 它只是将它们全部发送出去一旦它可以。

有人能指出任何明显的错误吗?

setTimeout

1 个答案:

答案 0 :(得分: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函数的定义。我相信如果你不为每次迭代定义函数,它会更有效。希望这会有所帮助。