2015-08-18 14 views
7

Qualcuno può spiegarmi perché la promessa risultante (d) dal codice sottostante è stata risolta immediatamente?Perché questa catena di promesse si risolve immediatamente?

//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()); 

Sto creando una serie di promesse che sono in attesa per sempre, quindi la promessa risultante dovrebbe anche essere in attesa per sempre come l'attesa di tutte le promesse successive per finire (as presented here). Ho usato le promesse per un po 'ora, ma mi manca chiaramente qualcosa qui.

Chrome DevTools - promises code executed

risposta

11

then non prende una Promise come ingresso, ci vogliono 2 funzioni, 1 per la realizzazione e 1 per il rifiuto.

La ragione d viene risolto è dovuto al fatto che la chiamata .then con un valore non-callable (anche un numero letterale - 1, o undefined) causa la funzione onFulfilled essere sostituito da "Identity", che semplicemente ri - riempire con qualsiasi valore è stato risolto nel passaggio precedente. Vedere PerformPromiseThen

Prova in questo modo:

//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()); 

Oppure, in alternativa ...

//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()); 

E dal momento che si sta utilizzando promesse & ES6, si potrebbe essere più concisa:

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

Come mai "Promise.resolve(). Then (new Promise (function (r, re) {}))" si risolve in una promessa in sospeso? – CodingIntrigue

+0

@RGraham in realtà non funziona –

+0

@ JaromandaX Forse sto registrando il messaggio errato. http://i.imgur.com/jEkWokl.png – CodingIntrigue

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

Lo stato iniziale della promessa è stato risolto, l'impostazione è Promise.resolve(). Controllare la documentazione di riduzione https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

+0

Questo non è corretto.L'adempimento o il rifiuto di una Promessa non ha effetto e influisce sullo stato di Promessa successivo. – sdgluck

+0

Fallito, scusa) – Maxx

Problemi correlati