【问题标题】:Resolve promise when multiple writeFile functions finished after for-loop in node.js在 node.js 中的 for-loop 后多个 writeFile 函数完成时解决 promise
【发布时间】:2016-01-16 16:13:25
【问题描述】:

首先,这是我当前代码的一部分:

return new Promise(function(resolve, reject) {
        for (var i = 1; i <= variables; i++) {
            fs.writeFile("file-" + i + ".txt", dataString + ' ' + i + ' 0', "utf-8");
        }   
        if (i == variables)
            resolve('Files have been written');
        else
            reject('Some error occured');
    })

我的问题是,在所有文件都被写入writeFile() 是异步之后,我不知道如何告诉我的承诺来解决。我想要做的是在我的下一个then() 中使用这些文件,当它们完全写入我的驱动器时。有人可以帮我吗?我现在有点迷路了,也是 node.js 的新手,所以请多多包涵:)

提前致谢!

#UPDATE 1:

    var promises = [];
    for (var i = 1; i <= variables; i++) {
        promises.push(Promise.resolve(
            new Promise(function(resolve, reject) {
                fs.writeFile('file-' + i + '.cnf', dimacs2 + ' ' + i + ' 0', 'utf-8', function(err) {
                    if (err) {
                        reject(err);
                    }
                    else {
                        resolve();
                    }
                });
            }
        )));
    }
    Promise.all(promises).then(function() {
        // code that runs after files have been written
    });

【问题讨论】:

  • 你想要Promise.all()
  • @SLaks 是的,我已经读过这个,但我不确定我会如何使用它。
  • 如果你使用像 q 这样的 Promise 库,然后创建像 var f = q.denodeify(fs.write) 这样的函数,将每个 fs.write 推送到 arr 中,它会创建一个 Promise 数组,然后使用 q.all(arr)为了那个原因 。否则每个 fs.write 都有一个回调,为每个创建一个承诺并等待所有解决
  • @PrakashRajagaopal 我在 node.js 中使用 Promise 的本机实现
  • 是的,它确实有 denodeify 和 all 。 github.com/then/promise 或至少我希望我正在查看正确的文档:D

标签: javascript node.js asynchronous promise


【解决方案1】:

也许你正在寻找这样的东西:

Promise.all(
  variables.map(function (variable, i) {
    return new Promise(function (resolve, reject) {
      fs.writeFile("file-" + i + ".txt", dataString + ' ' + i + ' 0', "utf-8", function (err) {
        if (err) {
          reject(err);
        } else {
          resolve();
        }
      });
    });
  })
)
.then(function () {
  // Files have been written
})
.catch(function (err) {
  // Some errors occured
});

【讨论】:

  • 感谢您的回答。我目前正在尝试类似于我在 #Update 1 下的原始帖子中所述的方法,但不幸的是我无法让它工作。显然,promises 数组中的 Promises 似乎永远不会解决,我不知道为什么,但我希望它与我的 writeFile 函数有关,因为它实际上将文件写入我的驱动器但文件本身是空的:/
  • @Since001 我很确定某处有拒绝,这就是为什么 then 子句没有被调用的原因。
  • @hege_hegedus 它实际上被调用了,但我的输出是:TypeError: Cannot read property 'then' of undefined
  • @Since001 这意味着您没有向我们展示的某些代码中存在实现错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2020-01-11
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
相关资源
最近更新 更多