Передача обещаний как функции onFulfilled в Promise.prototype.then - PullRequest
0 голосов
/ 19 декабря 2018

Я недавно обнаружил, что вы можете передать обещание вместо функции как onFulfilled функция в promise.then

Например:

var p = new Promise(function(resolve, reject) {
    setTimeout(function(){
        resolve("First Promise");
    }, 4000);
});

var q = new Promise(function(resolve, reject) {
    setTimeout(function(){
        console.log("Yo");
        resolve("Second Promise");
    }, 8000);
});


p.then(q).then(function(data){
    console.log(data);
});

Это выведет следующий вывод

First Promise (at 4th second)
Yo (at 8th second)

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

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

EDIT:

Я видел подобное поведение в Spotify Web Player.enter image description here

this._onStreamerConnect() возвращает Обещание, к которому прикреплено .then..then принимает параметр e, который также является Обещанием, как видно на вкладке Watch на правой панели

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Чтобы добавить к правильный ответ Патрика Робертса , вы можете вернуть Обещание из then, а функция then будет ждать Обещание, прежде чем продолжить .Однако для этого вам нужно передать функцию then, которая возвращает Обещание .

Таким образом, если ваша строка будет выглядеть следующим образом:

p.then(() => q).then(function(data){
    console.log(data);
});

Или без лямбд:

p.then(function() { return q; }).then(function(data){
    console.log(data);
});

Тогда вы увидите результат:

First Promise (at 4th second)
Yo (at 8th second)
Second Promise (at 8th second)

РЕДАКТИРОВАТЬ : К вашей точке зрения о Spotify, большинство вызовов функции, которую вы просматриваете _runOnDevice, имеют явно связанные функции в качестве второго и третьего аргументов.

Большинство имен аргументов являютсяТо же самое (t, e, n), несмотря на их позиции, что делает его немного запутанным.Я предполагаю, что эти функции передаются async в значительной степени с использованием лямбд.

Как указал Патрик в комментариях, по крайней мере один вызов _runOnDevice, кажется, принимает Promise в качестве второго параметра.Это похоже на ошибку.

Spotify code: vendor.125e9736.js

0 голосов
/ 19 декабря 2018

В соответствии с документацией MDN :

Если один или оба аргумента опущены или предоставлены не функции, то then будет отсутствовать обработчик (и),но не будет генерировать никаких ошибок.Если Promise, для которого вызывается then, принимает состояние (fulfillment или rejection), для которого then не имеет обработчика, новый Promise создается без дополнительных обработчиков, просто принимая конечное состояниеоригинала Promise, по которому был вызван then.

Это означает, что вызов p.then(q).then(function...) - это то же самое, что вызов p.then(function...).Параметр q полностью игнорируется и не входит в цепочку обещаний. Функция-исполнитель

q в конечном итоге разрешается за 8 секунд, независимо от p, который все еще разрешается за 4 секунды, и ничегопотребляет строку "Second Promise", как видно из вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...