/ / Який взаємозв'язок між Promises повернуто з ланцюжкової функції .then () у AngularJS [дублікат] - javascript, angularjs, promis, chain

Який зв’язок між Обіцянками повернувся з ланцюгової .then () функції у AngularJS [дублікат] - javascript, angularjs, obeation, ланцюг

Все:

Я досить новачок у 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 контролює спосіб вирішення цієї обіцянки:

  1. Якщо функція обробника повертає значення, яке не обіцяє, тоді обіцянка з вирішенням із цим значенням.
var thenPromise = originalPromise.then (успіх функції () { повернути "foo"; });  thenPromise.then (функція (дані) { console.log (дані); // "foo" });
  1. Якщо функція обробника повертає інше обіцянку, тоді .then обіцянка вирішить, як саме нова обіцянка дозволить (або відхилить)
var thenPromise = originalPromise.then (function () { повернути $ timeout (function () {return "foo";}, 1000); });  thenPromise.then (функція (дані) { console.log (дані); // (через 1 секунду) "foo" });
  1. Якщо функція обробника видає виняток або якщо повернення є явно відхиленим обіцянкою `$ 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 матиме відповідні резолюції.