Цепочки обещаний, неправильный порядок - PullRequest
1 голос
/ 19 марта 2019

Я бы хотел понять цепочку обещаний в Javascript.Итак, я написал эту маленькую скрипку: https://jsfiddle.net/GarfieldKlon/89syq4fh/

Это работает так, как задумано.c ждет b, а b ждет a.

Но когда я изменяю эти строки на:

a().then( result => console.log(result))
.then( () => {b().then( result => console.log(result))})
.then( () => {c().then( result => console.log(result))});

Поэтому я добавил фигурные скобки вокруг b и c, а затем получим 1, 3, 2. И я не понимаю, почему.

Когда я добавляю возврат, он снова работает:

a().then( result => console.log(result))
.then( () => {return b().then( result => console.log(result))})
.then( () => {return c().then( result => console.log(result))});

Но почему?Когда нет фигурных скобок, вы можете написать только одно утверждение, верно?И это утверждение неявно возвращается?

А когда вы используете фигурные скобки, вы должны явно что-то возвращать?

Но почему это портит порядок при использовании фигурных скобок без возврата?И почему он все еще что-то регистрирует, когда возврат отсутствует?

Ответы [ 3 ]

2 голосов
/ 19 марта 2019

Когда нет фигурных скобок, вы можете написать только одно выражение, которое неявно возвращается?И когда вы используете фигурные скобки, вы должны явно что-то вернуть?

Да .

Но почему это портит порядок при использовании фигурныхбрекеты без возврата?И почему он по-прежнему что-то регистрирует, когда возвращение отсутствует?

Поскольку функция обещания then полагается на возвращаемые значения для цепочки.

Помните, что thenвозвращает новое обещание для результата обратного вызова .Когда этот результат является другим обещанием, он ждет результата этого внутреннего обещания, прежде чем выполнить возвращенное обещание - то, на котором вы соединяете второй then() вызов.

Если ваш обратный вызов начинается b().then(…), новозвращает undefined, следующий шаг в цепочке (вызов c()) не ожидает завершения b.

1 голос
/ 19 марта 2019

При использовании синтаксиса стрелки вы можете интерпретировать его во многих вещах:

() => 'hello'

эквивалентно

() => { return 'hello'; }

Однако при выполнении

() => {'hello'}

как и то, что вы написали:

.then( () => {b().then( result => console.log(result))})

, тогда вы можете интерпретировать это как

() => {'hello'; return;}

Итак, в коде ваша обработка обещания b().then( result => console.log(result)) вызывается перед void return; сделано.Вы вообще не возвращаете полученный объект обещания.Он вызывается, когда b закончен, независимо от того, что вы делали.

0 голосов
/ 19 марта 2019

Это связано с функциями стрелок. Когда вы опускаете фигурные скобки, возврат неявен. Так

const f = () => 42;

эквивалентно

const f = () => { return 42; };

Кроме того, b().then(something).then(somenthingElse) - это всего лишь одно выражение, поэтому оно может быть возвращено неявно.

...