javascript - 等待回调nodejs

标签 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 中的回调被触发。 浏览了 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/

相关文章:

javascript - 确保我的 key 始终位于 javascript 对象中的第一个的最简单方法是什么?

node.js - 无法解决 React 和 SOCKET.IO CORS 错误

javascript - 在 map Node.js 中使用 waterfall

javascript - 使用回调/闭包/参数在 js 中循环

javascript - 如何让我的 JavaScript 引用外部定义的 var 来进行验证?

javascript - 如何防止修改AJAX请求

javascript - 如何限制 api 请求堆栈?

javascript - 如何在第一次运行时更新回调 View

javascript - 为什么这个超时回调没有返回?

javascript - 使用 CSS3 隐藏元素