我看了很多例子,但无法实现它......所以需要帮助..
问题..
我在这里创建了示例..
http://runnable.com/VI1efZDJvlQ75mlW/api-promise-loop-for-node-js-and-hello-world
如何投放
Api:http://web-91b5a8f5-67af-4ffd-9a32-54a50b10fce3.runnable.com/api/upload
方法:POST
content-type:multipart / form-data
使用名称上传多个文件。
...
最终的预期承诺是
files.name = "name of file"
files.content
files.content-type
files.size
- 保存到db。
目前我从文件中获取不同的内容..但其他文件内容未填充且未定义。
此致 Moyeen
答案 0 :(得分:4)
您正在寻找的技术是可以链接的
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
}));
});
});
基本上,我们告诉每个操作在前一个操作完成之后通过链接它们来导致return
导致等待异步值。
作为副产品,您以后可以使用
p.then(function(last){
// all done, access last here
});
处理程序将在所有承诺完成后运行。
答案 1 :(得分:0)
我已经用Q.all更新了代码,因为提到的p.then只执行一次。
http://runnable.com/VI1efZDJvlQ75mlW/api-promise-loop-for-node-js-and-hello-world
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);
});
});
问题是如果我有mongoose模型文件并想要保存,如何使用q.npost??