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