这是我的代码:
for (var i = 0; i < items.length; i++) {
doSomeWork('Company","{message : "message"}');
}
doSomeWork = function (companyIdentifier,item) {
var serialisedMessage = new serialisedMessageWithMetadata(item);
//I want this to block until the callback inside send is fired.
send(companyIdentifier, serialisedMessage.getJSON());
}
send = function (queueId, msg) {
var sqsQueueUrl = this.createQueueUrl(queueId);
var sqsParams = {
MessageBody: JSON.stringify(msg),
QueueUrl: sqsQueueUrl
};
sqs.sendMessage(sqsParams, function (err, data) {
if (err) {
console.log('ERR', err);
}
else {
console.log(data);
}
});
}
我希望我的 for 循环等待 sendMessage 中的回调被触发。 浏览了 Google 上的一些文章,我开始认为 Promises 就是我所需要的,但这似乎是简单地阻止函数的非常复杂的方法(而且我也无法让示例工作!)
我怀疑这是我缺少的一些基本内容,并且希望得到像“等待”这样的东西。
如有任何帮助,我们将不胜感激。
最佳答案
您无法阻止 Javascript 等待异步操作完成。事实并非如此。如果您想序列化消息,以便发送一条消息,收到成功的响应,然后发送下一条消息,那么您将必须专门为顺序异步操作编写代码。有多种方法。
以下是解决此问题的一些示例:
Making async javascript task in a loop
How to synchronize a sequence of promises?
Questions from the synchronous node.js
这里有一个想法,如何重组代码以使其按顺序工作:
function doAllWork(items, companyIdentifier) {
var cntr = 0;
function send(queueId, msg, done) {
var sqsQueueUrl = this.createQueueUrl(queueId);
var sqsParams = {
MessageBody: JSON.stringify(msg),
QueueUrl: sqsQueueUrl
};
sqs.sendMessage(sqsParams, function (err, data) {
if (err) {
console.log('ERR', err);
}
else {
console.log(data);
}
done(err, data);
});
}
function doSomeWork() {
// if still more do do, then do the next one
if (cntr < items.length) {
var serialisedMessage = new serialisedMessageWithMetadata(items[cntr++]);
//I want this to block until the callback inside send is fired.
send(companyIdentifier, serialisedMessage.getJSON(), function(err, data) {
if (!err) {
// do next iteration
doSomeWork();
}
});
}
}
}
doAllWork(items, 'Company","{message : "message"}');
关于javascript - 等待回调nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32144841/