Я относительно новичок в Node.js и JavaScript-оправдании, если вопрос ниже тупой. Для меня обещания для асинхронной обработки имеют смысл, но я не уверен на 100% об использовании обещаний, когда дело доходит до последовательной/последовательной обработки. Давайте посмотрим на пример (псевдокод):Использование обещаний для последовательной обработки
Цель: прочитать файл, обработать то, что было прочитано из файла, и отправить уведомление с помощью HTTP post call.
bendUniverseWithoutPromise: function() {
var data = fs.readFileSync(..); //Read the file
var result = processData(data);
this.postNotification(data);
}
В приведенной выше функции processData() не может работать до тех пор, пока мы не прочитаем файл. И мы не можем отправить уведомление, пока не закончим обработку.
Давайте посмотрим на несколько иной версии (предполагается, что каждый из указанных выше вызовов метода возвращают обещание или мы завернуть их в обещании):
bendUniverseWithPromise: function() {
return new Promise(function() {
fs.readFileAsync(fileName)
.then(processData(data))
.then(postNotification(result))
})
}
Теперь мои вопросы:
- Увидев, что нам требуется последовательная/последовательная обработка в этом случае, как версия обещания лучше, чем версия без обеда? Что он делает лучше, чем первый пример? Может быть, это плохой пример, но тогда что было бы хорошим примером для демонстрации различий?
- Помимо синтаксиса, версия обещания добавляет немного (только немного) в понятность читаемости кода и может усложниться с вложенными обещаниями, контекстом (это!) И т. Д.
- Я действительно понимаю, что технически первое метод НЕ будет возвращаться до тех пор, пока вся обработка не будет выполнена, а вторая немедленно вернется, а обработка, хотя и будет оставаться последовательной (в контексте метода), будет продолжена в фоновом режиме.
- Существует ли общее правило относительно использования обещаний? Существуют ли шаблоны и анти-шаблоны?
Благодарим вас заблаговременно.
Одно хорошее правило: может потребоваться время, и пользователи подумают, что мое приложение не отвечает, или пользователи могут делать другие вещи во время выполнения этих действий? если так перейдите к async – Luizgrs
Вы имели в виду 'this.postNotification (result);'? – Bergi
Вы можете найти [эти эмпирические правила] (http://stackoverflow.com/a/25756564/1048572) занимательные – Bergi