Це чудова тема для обговорення, сумна новина полягає в тому, що насправді це досить важко з рідними обіцянками.
Налагодження сирих обіцянок ES6 у Chrome жахливо. Це пов’язано з тим, що вони мовчки придушують помилки, і всякий раз, коли ви пропустите улов, це не дасть вам жодних ознак того, що обіцянка не вдалася. Оновлення: Chrome тепер реєструє необроблені відхилення (див. Це посилання, щоб дізнатися, як це зробити)
Promise.resolve("foo").then(function(){
throw new Error("You will never see this");
});
У Firefox справи стають трохи кращими, оскільки вони виконують невправлене виявлення відхилення, однак воно все ще не працює, і якщо ви призначили обіцянку в будь-якому місці, це не спрацює.
Отже, що можна зробити?
Включіть Bluebird - це надмірна кількість обіцянок ES6, і ви можете поміняти його прямо всередині, він має багатший API, він швидший і має дивовижні сліди стека . Він побудований з урахуванням налагодження та включає великі засоби обробки помилок.
Після включення Bluebird зателефонуйте:
Promise.longStackTraces();
Що трохи уповільнить (це все одно буде дуже швидко) і дасть вам дивовижні повідомлення про помилки. Наприклад:
Promise.resolve().then(function outer() {
return Promise.resolve().then(function inner() {
return Promise.resolve().then(function evenMoreInner() {
a.b.c.d()
});
});
});
У рідних обіцянках - це буде тихий збій, і його буде дуже важко налагодити - із обіцянками Bluebird це покаже велику червону помилку у вашій консолі за замовчуванням, що дає вам:
ReferenceError: a is not defined
at evenMoreInner (<anonymous>:6:13)
From previous event:
at inner (<anonymous>:5:24)
From previous event:
at outer (<anonymous>:4:20)
From previous event:
at <anonymous>:3:9
at Object.InjectedScript._evaluateOn (<anonymous>:581:39)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:540:52)
at Object.InjectedScript.evaluate (<anonymous>:459:21)
Закінчивши налагодження, ви можете поміняти його місцями і повернутися до власних обіцянок. Особисто я ціную, знаючи, що маю помилки у виробництві, тому не рекомендую, але це, звичайно, здійсненно.
reject('Error')
але чи можете ви опублікувати jsfiddle, щоб нам було з чим конкретно працювати?