承诺在nodejs中读取循环和文件

时间:2014-12-14 10:00:04

标签: javascript node.js promise q formidable

我看了很多例子,但无法实现它......所以需要帮助..

问题..

  1. 应该传递来自循环的内容以逐个执行。
  2. 每个循环迭代包含文件读取和数据库保存操作以及需要分配的其他几个对象属性。
  3. 我在这里创建了示例..

    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

2 个答案:

答案 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??