Семантически функции, возвращающие промисы, являются асинхронными функциями и, как вы знаете, могут быть объединены в цепочку:
a().then(b).then(c).catch(failure);
Хотя синхронные функции также могут быть частью асинхронных цепочек, это работает только потому, что функция .then
автоматически переводит возвращаемые значения из функций, которые вы ей передаете, в промисы. Например. Если b
и/или c
возвращают значения, которые не являются промисами, то цепочка все еще работает, но если a
возвращает не промис-значение, то это TypeError
.
В большинстве случаев вы, вероятно, знаете, что возвращает a
, так что это нормально, но в тех случаях, когда вы не знаете, что вернет a
(скажем, вы занимаетесь универсальным программированием), вы можете сделать это:
Promise.resolve(a()).then(b).then(c).catch(failure);
a
, b
и c
теперь обрабатываются одинаково в этом отношении:
- Если
a
возвращает 1
, то b
скоро будет вызываться с 1
.
- Если
a
возвращает обещание, то b
будет привязан к a
.
Метод Promise.reject
выполняет то же самое для цепочек отказов.
Кроме того, эти методы могут быть удобны в тех случаях, когда вам просто нужно обещание, которое разрешается сразу. Например.
[a, b, c].reduce((p, f) => p.then(f), Promise.resolve()).catch(failure);
person
jib
schedule
09.09.2015