Bluebird 依次执行一系列承诺
Bluebird Execute array of promises in series
我正在尝试执行以下功能。
- 写入文件
- 发送带有附件的电子邮件
- 删除文件
我正在执行下面的代码,但是当我收到电子邮件时,该文件包含 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
})
要序列化操作,您需要在轮到它们之前不要调用它们。您对 writeFile
、sendMail
和 removeFile
的分配是立即调用它们的所有函数,这绝对不是您想要的。
假设 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()
不是同步的,那么您需要它的回调或承诺,以便您可以知道它何时完成,以便异步链接。
我正在尝试执行以下功能。
- 写入文件
- 发送带有附件的电子邮件
- 删除文件
我正在执行下面的代码,但是当我收到电子邮件时,该文件包含 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
})
要序列化操作,您需要在轮到它们之前不要调用它们。您对 writeFile
、sendMail
和 removeFile
的分配是立即调用它们的所有函数,这绝对不是您想要的。
假设 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()
不是同步的,那么您需要它的回调或承诺,以便您可以知道它何时完成,以便异步链接。