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