javascript - 通过异步回调函数传递不同版本的变量

标签 javascript node.js asynchronous callback async.js

我在处理一些异步数据库查询时遇到问题。我正在使用 Node.js 的异步库。我有一些代码在调用 add() 函数之前形成一个对象。在我的代码中,我有一个循环执行多次创建对象。

for(var i = 0; i < 10; i++){ 
    var obj.id = i + '_idstring';
    add(obj);
}

正如您所看到的,每个对象都略有不同。我需要在数据库中执行查找,以查看该对象是否已存在(第一个 waterfall 函数),如果不存在,请将其添加到我的数据库中(第二个 waterfall 函数)。我的问题是,loaObj.id 始终等于 10_idstring。这是我通过回调传递对象的方式有问题吗?我应该如何处理这个问题?

function add(loaObj) {
    async.waterfall([
        function(loaObj, callback) {
            var sql = "";
            connection.query(sql, function(error, results, fields) {
                callback(error, results, loaObj);
            });
        },
        function(results, loaObj, callback) {
            if (results.length > 0) {
                sendMessage();
            } else {
                var sql = "";
                connection.query(sql, function(error, results, fields) {
                    callback(error, loaObj);
                });
            }
        }
    ], function(err, loaObj) {
        console.log(err);
        if (err) {
            sendMessage();
        } else {
            sendMessage();
        }
    });
}

最佳答案

因为您使用的是对象,它将通过“引用的副本”传递,所以 obj.id 将在每个循环中被覆盖,并且它将稳定为 10_idstring -循环停止的地方-。 一个简单的解决方案是每次都传递新对象,如下所示:

for(var i = 0; i < 10; i++){ 
  add({id: `${i}_idstring`});
}

关于javascript - 通过异步回调函数传递不同版本的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45516840/

相关文章:

javascript - 启用换行后如何在 Ace Editor 中禁用后续行的缩进

node.js - 在nodejs中使用axios下载图片

javascript - 需要从页面源中定位视频代码,以及如何使视频可播放

C++11 异步 + 然后

java - 在 Controller 中使用 @Async 和 CompletableFuture 可以提高我们 api 的性能吗?

javascript - Javascript 中的返回函数及其工作原理?

javascript - 当元素被另一个元素替换时继续动画

json - 多个异步 mongo 请求生成困惑的返回

javascript - 如何组织一个在 Node-express 服务器上运行的网站?

javascript - AngularJS 丢失了从 multipartForm 指令到路由的数据