等待回调nodejs

时间:2015-08-21 16:05:45

标签: javascript node.js callback

这是我的代码:

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;等等。

任何帮助都将不胜感激。

2 个答案:

答案 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)
            }
        });
    }