2017-01-09 96 views
1

我認爲應該可以在使用ES6 Promise時鏈接.then()方法。換句話說,我認爲,當一個承諾解決後,傳遞給解析函數的值應該傳遞給任何鏈接的,然後處理程序。如果這樣怎麼回事回來undefined在鏈接然後處理程序下面?鏈接.then()調用ES6承諾

function createPromise() { 
    return new Promise((resolve) => { 
    resolve(true); 
    }); 
} 

createPromise() 
    .then((value) => { 
    console.log(value); // expected: true, actual: true 
    }) 
    .then((value) => { 
    console.log(value); // expected: true, actual: undefined 
    }); 
+0

您不會爲鏈接的'.then()'返回任何值作爲值。 – Jecoms

回答

4

每個then()可以返回將用作解析值下一個then()調用的值。在您的第一個then()中,您不會返回任何內容,因此value在下一次回調中未定義。第一個返回value,使其在第二個中可用。

function createPromise() { 
 
    return new Promise((resolve) => { 
 
    resolve(true); 
 
    }); 
 
} 
 

 
createPromise() 
 
    .then((value) => { 
 
    console.log(value); // expected: true, actual: true 
 
    return value; 
 
    }) 
 
    .then((value) => { 
 
    console.log(value); // expected: true, actual: true 
 
    });

2

你必須將它放回承諾中傳遞給它。或者創建一個可以解決的新承諾。

createPromise() 
.then((value) => { 
    return value; 
}) 
.then((value) => { 
    console.log(value); 
}); 

或者

createPromise() 
.then((value) => { 
    return new Promise.resolve(value); 
}) 
.then((value) => { 
    console.log(value); 
}); 
0

.then始終返回解析爲回調函數的返回值的承諾。由於您在第一次致電.then時沒有返回任何內容,因此undefined將成爲返回Promise的解析值。

換句話說,如果你想在第二次調用.then解決true,你必須在第一回吧,像這樣,

createPromise() // returns a Promise 
    .then(function (value) { 
    console.log(value); // => true 
    return value; // now this will return a Promise that resolves the value `true` 
    }).then(function (value) { 
    console.log(value) // => true 
    }); 

您可以參考MDN's documentation on method chaining爲ES2015承諾如果你需要更多的信息。