Все:
Я досить новачок у Promise, мені просто цікаво, як вони вирішуються, одне мене бентежить:
Деякі публікації показують використання
var defer = $q.defer();
// some logic block
{
// if success doing something
defer.resolve();
}
return defer.promise;
Але якщо використовується функція .then (), обіцянка повертається з .then (function () {}), цікаво, як я можу контролювати, чи ця обіцянка вирішена чи ні?
Ще одна плутанина полягає в тому, що якщо я використовую якийсь ланцюжок.функція then (), цікаво, який взаємозв'язок між ними, це той самий об'єкт обіцянки, який щойно переданий, або кожен .потім згенерує новий об'єкт Promise і поверне його?
Відповіді:
1 для відповіді № 1Як зазначено в цьому в усьому і зрозуміло документ:
ПИТАННЯ 1. Цікаво, як я можу контролювати, вирішено це обіцянку чи ні?
Один з API Promise підтримує певні функції, які resolve()
або reject()
обіцянка. Таким чином, ви можете використовувати наступні функції у своєму коді
var promise = new Promise(function(resolve, reject) {
// do a thing, possibly async, then…
if (/* everything turned out fine */) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});
Відмови трапляються, коли обіцянку явно відхилено, але також неявно якщо в зворотному виклику конструктора виникає помилка.
var jsonPromise = new Promise(function(resolve, reject) {
// JSON.parse throws an error if you feed it some
// invalid JSON, so this implicitly rejects:
resolve(JSON.parse("This ain"t JSON"));
});
jsonPromise.then(function(data) {
// This never happens:
console.log("It worked!", data);
}).catch(function(err) {
// Instead, this happens:
console.log("It failed!", err);
});
В інших варіантах Обіцянка вирішується із значенням повернення, яке передається наступній ланці в ланцюжку.
ЗАПИТАННЯ 2.
Обіцянки в певному сенсі є функціями, які будутьпривести в майбутньому з певною цінністю. Результат - це значення, яке повертається з обіцянки - отже, в основному ланцюжок обіцянок (. Then (...). Then ...) - це ланцюжок функцій, які чекають, поки закінчиться попередня (вирішити з деяким значенням). Потім вони викликаються з аргументом, який є повернутим значенням останньої виконаної функції в черзі (попередня ланка в ланцюжку).
.then()
повертає новий об'єкт обіцянки, таким чином дозволяючи ланцюжок. (див. коментар до посилання на документацію)
ЗАМОВЛЕННЯ
Існує великий і малий опис усіх обіцянок Angular в Росії офіційна документація під розділом Promise API
а наступний - Chaining the promises
.
1 для відповіді № 2
Це не спроба пояснити обіцянки у їх повній красі - для цього існують блоги. Це відповісти на ваші конкретні запитання:
Q1:
Але якщо я використовую
.then()
функція, обіцянка повертається з.then(function(){})
, Цікаво, як я можу контролювати, чи ця обіцянка вирішена чи ні?
Функція обробника вирішення .then
контролює спосіб вирішення цієї обіцянки:
- Якщо функція обробника повертає значення, яке не обіцяє, тоді обіцянка з вирішенням із цим значенням.
var thenPromise = originalPromise.then (успіх функції () { повернути "foo"; }); thenPromise.then (функція (дані) { console.log (дані); // "foo" });
- Якщо функція обробника повертає інше обіцянку, тоді
.then
обіцянка вирішить, як саме нова обіцянка дозволить (або відхилить)
var thenPromise = originalPromise.then (function () { повернути $ timeout (function () {return "foo";}, 1000); }); thenPromise.then (функція (дані) { console.log (дані); // (через 1 секунду) "foo" });
- Якщо функція обробника видає виняток або якщо повернення є явно відхиленим обіцянкою `$ q.reject:
var thenPromise = originalPromise.тоді (function () { повернути $ q.reject ("якась помилка"); }); thenPromise.then (функція (дані) { console.log (дані); // не потрапляє сюди }) .catch (функція (помилка) { console.log (помилка); // "якась помилка" });
Q2:
Якщо я використовую кілька прикутих
.then()
Функція, цікаво, який взаємозв'язок між ними, це той самий об'єкт обіцянки, який щойно переданий, або кожен.then
згенерує новий об’єкт Promise і поверне його?
Кожен .then
породжує власну обіцянку.
var timeoutPromise = $ timeout (afterTimeout, 1000); var thenPromise = timeoutPromise.then (doSomething); var anotherThenPromise = timeoutPromise.then (doSomethingElse);
Якщо timeoutPromise
вирішує, то обидва doSomething
і doSomethingElse
буде виконувати і залежно від їх результату thenPromise
і anotherThenPromise
матиме відповідні резолюції.