2015-10-08 4 views
0

Я пытаюсь выполнить следующую функцию.
Bluebird Выполнение массива обещаний последовательно

  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, 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() не синхронны, то вам нужен обратный вызов или обещание от него, так что вы можете сказать, когда это будет сделано, так что будет цепь асинхронно.

Смежные вопросы