Избягвайте забравени връщания на обещания

Когато използвам обещания за изразяване на зависимости между задания, където разрешената стойност става маловажна, има известна опасност да забравя връщане някъде. Пример:

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

Тук Q.all връща обещание и трябваше да го върна. Ако не направите това, означава, че до момента, в който collectOutput бъде извикан, всички задачи са стартирани, но няма гаранции, че са приключили.

Този вид грешка води до състояние на състезание и може да бъде изключително трудно да се възпроизведе и проследи. Така че се чудя има ли някакъв инструмент, който да помогне за откриването и избягването на този вид проблем? Може би някаква обещаваща библиотека, която предупреждава, когато функция по пътя се връща недефинирана? Или открива обещания без слушатели, както 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

Предупреждение: обещание е създадено в манипулатор, но нищо не е върнато от него. Това обикновено означава, че просто сте забравили оператор за връщане

някъде, което ще причини неизбежно обещание, което не е свързано с никаква верига обещания.

Например:

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