在 node.js 中延迟执行异步消息传递函数

Delaying execution of an async messaging function in node.js

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

我使用 forEach 提取每个 lat/lng 对并使用 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);
});

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 函数的定义移到了循环之外。我相信如果您不为每次迭代都定义函数,它的性能会更高一些。希望这有帮助。