Избегайте возврата забытых обещаний

Когда я использую промисы для выражения зависимостей между заданиями, где разрешенное значение становится неважным, есть некоторая опасность, что я могу где-то забыть о возврате. Пример:

startSomething().then(function() {
  Q.all(tasks.map(function(task) { return task.startIt(); }))
}).then(collectOutput).done();

Здесь Q.all возвращает обещание, и я должен был вернуть его. Невыполнение этого требования означает, что к моменту вызова collectOutput все задачи уже запущены, но нет никаких гарантий их завершения.

Этот тип ошибки приводит к состоянию гонки, и его может быть чрезвычайно сложно воспроизвести и отследить. Поэтому мне интересно, есть ли какой-нибудь инструмент, который поможет обнаружить и избежать такого рода проблем? Возможно, какая-то библиотека обещаний, которая предупреждает, когда функция по пути возвращает значение undefined? Или обнаруживает обещания без слушателей, как Bluebird делает для необработанных отклонений?


person MvG    schedule 21.12.2015    source источник
comment
Стоит отметить, что TypeScript может обнаруживать эту забытую проблему возврата во время компиляции. Это может быть больше изменений, чем вы ищете (вы просили библиотеку, вы получаете предложение обновить свой язык), но, по моему личному мнению, TypeScript — это абсолютно стоящая инвестиция.   -  person DCoder    schedule 23.12.2015
comment
Я считаю, что использование стрелочных функций без {} помогает, так как возврат неявный. Например. startSomething().then(() => Q.all(tasks.map(task => task.startIt())))   -  person jib    schedule 24.12.2015


Ответы (1)


На самом деле, bluebird предупредит вас, если вы создали промис в обработчике, но не не вернуть его. Если вы готовы отказаться от Q.

Вот более подробное объяснение предупреждений bluebird

Предупреждение: обещание было создано в обработчике, но из него ничего не было возвращено Обычно это означает, что вы просто забыли оператор return

где-то, что вызовет безудержное обещание, которое не связано ни с какой цепочкой обещаний.

Например:

getUser().then(function(user) {
    getUserData(user);
}).then(function(userData) {
    // userData is undefined
});
person Madara's Ghost    schedule 22.12.2015
comment
о, как бы я хотел, чтобы angular $q делал что-то подобное - person jusopi; 22.12.2015
comment
Вы можете довольно легко использовать bluebird в angular: "> stackoverflow.com/questions/23984471/ - person Madara's Ghost; 23.12.2015