Perché il valore non è definito in .then () concatenato con Promise?

Dato

function doStuff(n /* `n` is expected to be a positive number */) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(n * 10) }, Math.floor(Math.random() * 1000)) }) .then(function(result) { if (result > 100) { console.log(result + " is greater than 100") } else { console.log(result + " is not greater than 100"); } }) } doStuff(9) .then(function(data) { console.log(data) // `undefined`, why? }) 

Perché i data undefined data undefined alla .then() concatenata a doStuff() ?

Perché nessuna Promise o altro valore viene return da .then() concatenato al costruttore Promise .

Nota che .then() restituisce un nuovo object Promise .

La soluzione è return un valore o un’altra chiamata di funzione che return un valore sa o Promise da .then() .

 function doStuff(n /* `n` is expected to be a positive number */) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(n * 10) }, Math.floor(Math.random() * 1000)) }) .then(function(result) { if (result > 100) { console.log(result + " is greater than 100") } else { console.log(result + " is not greater than 100"); } // `return` `result` or other value here // to avoid `undefined` at chained `.then()` return result }) } doStuff(9) .then(function(data) { console.log("data is: " + data) // `data` is not `undefined` }); 

Il problema stava affrontando:

 return (new Promise(..)) //the promise we want to return .then(()=>undefined) // the promise were actually returning, which resolves to undefined 

Come forse già notato, restituisce una nuova promise. Questo ha una buona ragione, rende la promise concatenare facile, ad esempio:

 getUser()//an asynchronous action .then(user=>login(user))//then if we get the user,promise to log in .then(token=>console.log("logged in,token is "+token) //then if we logged in, log it .catch(error=>"login failed");//catch all errors from above 

Ma questo crea anche la piccola trappola, stiamo affrontando. La soluzione potrebbe restituire la promise originale e non la nuova promise restituita automaticamente da .then () poiché viene risolta in modo indefinito poiché la funzione all’interno non restituisce esplicitamente qualcosa:

 //what were doing: Promise.resolve(n*10)//the original promise resolves to n*10 .then(a=>undefined)//the then gets n*10 passed as a, but returns undefined .then(b=>console.log(b));//b will be undefined :0 //what we want: var promise=Promise.resolve(n*10); promise.then(a=>undefined);//a is n*10, this resolves to undefined promise.then(b=>console.log(b));//but this still logs n*10, as its the original promise :) 

Quindi, come puoi vedere, per restituire la promise originale, noi semplicemente lo memorizziamo in una variabile, quindi assegniamo un .then handler ad esso, e abbiamo ancora un riferimento alla promise originale che possiamo assegnare ad altri gestori (o restituire).

In azione:

 function doStuff(n /* `n` is expected to be a number */) { //create a new promise and store it var promise=new Promise(function(resolve, reject) { setTimeout(function() { resolve(n * 10) },1000); }); //add a then handler to this promise promise.then(result=>console.log(result + " is "+result<100?"not":""+" greater than 100")); //return the original one return promise; } doStuff(9).then(function(data) { console.log(data) //not undefined, as original promise }) 

Il doStuff sta restituendo la Promise . Ma la tua ultima funzione non restituisce alcun valore, quindi i data sono undefined .

Nelle promesse, il valore degli argomenti della funzione then è il valore restituito della funzione then precedente.

 function doStuff(n /* `n` is expected to be a positive number */) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(n * 10) }, Math.floor(Math.random() * 1000)) }) .then(function(result) { if (result > 100) { console.log(result + " is greater than 100") } else { console.log(result + " is not greater than 100"); } return result; }) } doStuff(9) .then(function(data) { console.log(data) // `90` }) 

Non stai restituendo il risultato da .then () incatenato alla Promessa. Devi aggiungere un risultato di ritorno; al .then ()

Poiché il valore dei dati è il valore di ritorno dell’ultimo .then() , l’ultimo .then() non ha un valore di ritorno valido.

Quindi, è ansible aggiungere il valore di ritorno nell’ultima funzione .then() .