Bluebird 依次执行一系列承诺

Bluebird Execute array of promises in series

我正在尝试执行以下功能。

  1. 写入文件
  2. 发送带有附件的电子邮件
  3. 删除文件

我正在执行下面的代码,但是当我收到电子邮件时,该文件包含 ENOENT 内容。
当我删除变量 removeFile 时,我会收到包含我请求的所有内容的电子邮件。
我也尝试过 Promise.reduce,但也没有运气。
我做错了什么?

var writeFile = fs.writeFileAsync(filePath, csv)
var sendMail = sendEmail(to, from, msg, subject, fileName, filePath)
var removeFile = fs.unlinkAsync(filePath)
  return Promise.each([writeFile, sendMail, removeFile], function(fn){
    return fn
})

要序列化操作,您需要在轮到它们之前不要调用它们。您对 writeFilesendMailremoveFile 的分配是立即调用它们的所有函数,这绝对不是您想要的。

假设 sendMail() 是同步的,那么你需要链接你的承诺:

fs.writeFileAsync(filePath, csv).then(sendMail).then(function() {
    return fs.unlinkAsync(filePath);
}).then(function() {
    // everything done successfully here
}, function(err) {
    // some sort of error here
});

如果 sendMail() 不是同步的,那么您需要它的回调或承诺,以便您可以知道它何时完成,以便异步链接。