Javascript 数组中每个对象上的多个异步操作导致意外结果

Javascript 数组中每个对象上的多个异步操作导致意外结果,javascript,node.js,asynchronous,callback,async.js,Javascript,Node.js,Asynchronous,Callback,Async.js,我对Node.js还比较陌生,现在仍然对回调和Node.js的异步特性耿耿于怀。我遇到了一个我无法解决的问题;我已经彻底搜索了溢出并阅读了支持文档,但仍然无法使其正常工作 本质上,问题是我有一个对象数组,我想对每个对象按顺序应用一些异步操作。我研究了Async.js并尝试了各种回调结构,但我的编译器一直在对我大喊大叫 我最新版本的代码是: function processObjects(objects){ console.log(objects); async.forEach

我对Node.js还比较陌生,现在仍然对回调和Node.js的异步特性耿耿于怀。我遇到了一个我无法解决的问题;我已经彻底搜索了溢出并阅读了支持文档,但仍然无法使其正常工作

本质上,问题是我有一个对象数组,我想对每个对象按顺序应用一些异步操作。我研究了Async.js并尝试了各种回调结构,但我的编译器一直在对我大喊大叫

我最新版本的代码是:

function processObjects(objects){

    console.log(objects);

    async.forEachOf(objects, function(object, key, callback){

        var imageProfile;
        var files = {};

        function readFile(callback){
            fm.mdfil("templates/no_object.jpg", function(result) {  // Read metadata from no_object.jpg template
                console.log("check1");
                files['name'] = object + "_" + timestamp + ".jpg"; // file.name = object.id + timestamp
                files['type'] = ".jpg";
                files['size'] = result.size;
                callback();
            });
        }

        function updateFileProfileAgain(result, callback){
            console.log("check2");
            var obj = [];
            obj.push(object);
            f.insF(req.user._id, files.name, "", "", files.type, files.size, "", "", "", timestamp, obj, function(result){  // Add record of the image to the Files Collection
                callback(null, result);
            });
        }

        function updateImageRef(result, callback){
            console.log("check3");
            o.updSO(object, "imageRef", imageProfile.insertedId, function(result){
                callback(null, result);
            });
        }

        function updateObjectImage(result, callback){
            console.log("check4");
            o.updSO(object, "objectImg", files.name, function(result){
                callback(null, result);
            });
            callback();
        }

        readFile(function(callback){
            updateFileProfileAgain(function(result, callback){
                updateObjectImage(function(result, callback){
                    updateImageRef(function(result, callback){
                        console.log(result);
                    });
                });
            });
        });

        readFile();
    },
    function(err, result){
        console.log("done");
    });
}
时间戳是一个全局变量。对象是具有唯一ID的数组。本质上,我希望解析所有这些唯一ID,为它们提供自己的映像(在readFile函数中),将该映像的记录添加到单独的集合(UpdateFileProfile),将插入的记录的引用添加到对象的记录(updateImageRef),并最终将映像记录的字符串添加到每个对象的ObjectMg字段中(更新对象图像)

这段代码的输出不同于未定义的回调(作为函数)和未定义的结果。在某些情况下,我确实在客户端上得到了结果,这将显示一个对象的更新记录,而不是另一个对象的更新记录(就好像files变量没有更新或使用了最后一个已知值),如下所示:

  • 对象[0]:imageRef:“594912a794c9dc8488292025”
  • 对象[1]:imageRef:“”
对于字段、对象等也是如此


非常感谢您的帮助!

您没有将每个函数的结果传递给下一个函数

此外,回调可能是一个令人头痛的问题。我建议您使用
承诺链接

Objects.forEach(function (object) {
  readFile(object)
    .then(function(file) { return updateFileProfileAgain(file) })
    .then(function(result) { return updateObjectImage(result) })
    .then(function(image) { return updateImageRef(image) });
});
使用ES6

Objects.forEach((object) => {
  readFile(object)
    .then(file => updateFileProfileAgain(file))
    .then(result => updateObjectImage(result))
    .then(image => updateImageRef(image));
});

您没有将每个函数的结果传递给下一个函数

此外,回调可能是一个令人头痛的问题。我建议您使用
承诺链接

Objects.forEach(function (object) {
  readFile(object)
    .then(function(file) { return updateFileProfileAgain(file) })
    .then(function(result) { return updateObjectImage(result) })
    .then(function(image) { return updateImageRef(image) });
});
使用ES6

Objects.forEach((object) => {
  readFile(object)
    .then(file => updateFileProfileAgain(file))
    .then(result => updateObjectImage(result))
    .then(image => updateImageRef(image));
});

嗨,Matías,谢谢你的回答。我尝试过实现承诺,但我的控制台告诉我它无法读取“then”的属性。我是否遗漏了一些明显的内容?嗨,Matías,谢谢你的回答。我尝试过实现承诺,但我的控制台告诉我它无法读取“then”的属性。我是否遗漏了一些明显的内容?