Javascript nodejs中读取循环和文件的承诺

Javascript nodejs中读取循环和文件的承诺,javascript,node.js,promise,q,formidable,Javascript,Node.js,Promise,Q,Formidable,我看了很多例子,但没能做到,所以我需要帮助 问题 循环中的内容应该一个接一个地传递给执行。 每个循环迭代都包含一个文件读取和数据库保存操作,以及一些需要分配的其他对象属性。 我在这里创建了一个例子 如何运行: Api: 方法:邮寄 内容类型:多部分/表单数据 上载多个名为的文件 最终的预期承诺是 -保存到数据库 当前我从文件中获取不同的内容。但其他文件内容未填充且未定义 问候 Moyeen您正在寻找的技术是可靠的链接 var p= Q(); Object.keys(files).forEach

我看了很多例子,但没能做到,所以我需要帮助

问题

循环中的内容应该一个接一个地传递给执行。 每个循环迭代都包含一个文件读取和数据库保存操作,以及一些需要分配的其他对象属性。 我在这里创建了一个例子

如何运行:

Api:

方法:邮寄

内容类型:多部分/表单数据

上载多个名为的文件

最终的预期承诺是

-保存到数据库

当前我从文件中获取不同的内容。但其他文件内容未填充且未定义

问候
Moyeen

您正在寻找的技术是可靠的链接

var p= Q();
Object.keys(files).forEach(function(key){
  p = p.then(function(){ // chain the next one
    return Q.nfcall(fs.readFile, files[key].path, "binary", i). // readfile
      then(function (content) { // process content and save
        files.filename =  files[key].name;
        files.path = files[key].path;
        files.content_type = files[key].type;
        files.size = files[key].size;
        console.log(files.filename);
        files.content = binaryToBase64(content);
        return Q.npost(art.save, art); // wait for save, update as needed
    }));
  });
});
基本上,我们告诉每个操作在前一个操作完成后发生,方法是链接它们并返回,这会导致对异步值的等待

作为副产品,您可以稍后使用

p.then(function(last){
    // all done, access last here
});

处理程序将在所有承诺完成后运行。

我已经用Q.all更新了代码,正如前面提到的p.then将只执行一次


问题是如果我有mongoose模型文件并想保存…,如何使用q.npost?

你能在你的问题中发布相关代码吗?@Bergi代码在链接中..嗯。当然,现在runnable已经被买断了,你的URL上的任何内容都是1GB,似乎不是javascript代码。@Bergi所说的就是一个很好的例子!为什么不使用reduce?@Bergi注意文件是一个对象,我在这里迭代它的键,所以编辑是不正确的。我会在我自己的代码中使用.reduce,但一般来说,我发现人们在堆栈溢出中对它的理解要少得多,让他们同时学会两件事。承诺和reduce听起来像是矫枉过正。我不能投票,因为我没有声誉可以投票。:@Bergi别担心,我以前至少对你们做过一次/两次:P检查我的答案归还npost@BenjaminGruenbaum我尝试了返回…但它没有发布…只是在日志中得到了输出…@BenjaminGruenbaum我做了以下更改它更新了thansk。。Q.npostfiles,保存;//等待保存,根据需要更新
p.then(function(last){
    // all done, access last here
});
 form.parse(req, function(err, fields, files) {
    var p = Q();
    Object.keys(files).forEach(function (key) {
        promises.push(p.then(function () { // chain the next one
            return Q.nfcall(fs.readFile, files[key].path, "binary"). // readfile
                then(function (content) { // process content and save
                   file = {};
                    file.filename = files[key].name;
                    file.path = files[key].path;
                    file.content_type = files[key].type;
                    file.size = files[key].size;
                    console.log(files[key].name);
                    file.content = binaryToBase64(content);
                    filesarr.push(file);
                   // Q.npost(art.save, art); // wait for save, update as needed
                })
        }));

        Q.all(promises);
    });
});