2015-10-08 136 views
0

我正在尝试执行以下功能。
蓝鸟执行系列承诺数组

  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 
}) 
+0

您在创建承诺时开始采取行动,而不是在您对其调用'Promise.each'时开始行动。 – Bergi

回答

0

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

假设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()是不同步的,那么你需要一个回调或从一个承诺,所以你可以当它这样做,它会告诉链异步。