2015-08-18 5 views
7

Может кто-нибудь объяснить мне, почему итоговое обещание (d) из кода ниже разрешено немедленно?Почему эта цепочка обещаний сразу решает?

//promises that are never resolved nor rejected 
var a = new Promise(function(r,re){}); 
var b = new Promise(function(r,re){}); 
var c = new Promise(function(r,re){}); 

var d = [a, b, c].reduce(function (previousPromise, promise) { 
    return previousPromise.then(promise); 
    }, Promise.resolve()); 

Я создаю массив обещаний, которые ожидают навсегда, так что в результате обещание должно также быть в ожидании навсегда, как он ждет все последующие обещания закончить (as presented here). Я уже давно использую обещания, но я явно что-то пропустил.

Chrome DevTools - promises code executed

ответ

11

then не принимает Promise в качестве входного сигнала, он принимает 2 функции, 1 для выполнения и 1 для отказа.

Причина d решается это связано с тем, что вызов .then с не вызываемым значения (даже номер буквальным - 1, или undefined) вызывает onFulfilled функцию, которая будет заменить «Идентичность», который просто повторно -fulfills с любым значением, которое было разрешено на предыдущем шаге. См PerformPromiseThen

Попробуйте так:

//promises that are never resolved nor rejected 
var a = function() { return new Promise(function(r,re){}); }; 
var b = function() { return new Promise(function(r,re){}); }; 
var c = function() { return new Promise(function(r,re){}); }; 
// or simply, a = b = c after setting the function for c 

var d = [a, b, c].reduce(function (previousPromise, fn) { 
    return previousPromise.then(fn, /* not passing a rejection handler... */); 
    }, Promise.resolve()); 

или в качестве альтернативы ...

//promises that are never resolved nor rejected 
var a = new Promise(function(r,re){}); 
var b = new Promise(function(r,re){}); 
var c = new Promise(function(r,re){}); 

var d = [a, b, c].reduce(function (previousPromise, promise) { 
    return previousPromise.then(function() {return promise;}); 
    }, Promise.resolve()); 

И так как вы используете обещания & ES6, вы могли бы быть более кратким:

let a = new Promise(() => {}); 
let b = new Promise(() => {}); 
let c = new Promise(() => {}); 

let d = [a, b, c].reduce((previousPromise, promise) => 
    previousPromise.then(() => promise), 
    Promise.resolve()); 
+0

Как получилось 'Promise.resolve(). Then (new Promise (function (r, re) {}))' разрешает ожидающее обещание? – CodingIntrigue

+0

@RGraham это действительно не –

+0

@JaromandaX Возможно, я регистрирую это неправильно. http://i.imgur.com/jEkWokl.png – CodingIntrigue

-1
var d = [a, b, c].reduce(function (previousPromise, promise) { 
    return previousPromise.then(promise); 
}, Promise.resolve()); 

Ваше начальное состояние обещания разрешено, вы устанавливаете его как Promise.resolve(). Проверьте документацию по уменьшению https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

+0

Это неверно.Выполнение или отторжение обещания не ложится и не влияет на статус последующего обещания. – sdgluck

+0

Моя неудача, извините) – Maxx

Смежные вопросы