这是我的代码:
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被触发的回调中等待。 通过浏览谷歌上的一些文章,我开始认为Promises是我所需要的,但这似乎是简单地阻止一个函数的复杂方式(我也无法让这些例子工作!)
我怀疑这是我缺少的一些基本内容,并希望有类似的东西,等待&#34;等等。
任何帮助都将不胜感激。
答案 0 :(得分:1)
您无法阻止等待异步操作完成的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"}');
答案 1 :(得分:0)
通过向send函数添加回调并使用npm async模块阻止for循环。 像这样的东西?
async.forEach(items,function(item,innerCallback){
var serialisedMessage = new serialisedMessageWithMetadata(item);
//I want this to block until the callback inside send is fired.
send(companyIdentifier, serialisedMessage.getJSON(),function(err,res){
if(!err){
console.log("SUCCESS");
}else{
console.log("SUCCESS");
}
innerCallback();
});
},function(err,res){
console.log("Finsied sending msgs");
})
send = function (queueId, msg,callback) {
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);
callback(true,"ERROR")
}
else {
console.log(data);
callback(null,data)
}
});
}