3 回答

TA貢獻(xiàn)1846條經(jīng)驗 獲得超7個贊
返回值將永遠(yuǎn)是一個承諾。如果您未明確返回承諾,則返回的值將自動包裝在承諾中。
async function increment(num) {
return num + 1;
}
// Even though you returned a number, the value is
// automatically wrapped in a promise, so we call
// `then` on it to access the returned value.
//
// Logs: 4
increment(3).then(num => console.log(num));
即使有,也是一樣await。
function defer(callback) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(callback());
}, 1000);
});
}
async function incrementTwice(num) {
const numPlus1 = await defer(() => num + 1);
return numPlus1 + 1;
}
// Logs: 5
incrementTwice(3).then(num => console.log(num));
Promise自動解包,因此,如果您確實從async函數(shù)中返回了對某個值的承諾,您將收到該值的承諾(而不是該值的承諾)。
function defer(callback) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(callback());
}, 1000);
});
}
async function increment(num) {
// It doesn't matter whether you put an `await` here.
return defer(() => num + 1);
}
// Logs: 4
increment(3).then(num => console.log(num));
在我的提要中,該行為的確與傳統(tǒng)的return語句不一致??雌饋?,當(dāng)您從異步函數(shù)中顯式返回非承諾值時,它將強制將其包裝在Promise中。我沒有什么大問題,但是它確實違背了普通的JS。
ES6的函數(shù)返回的值與并不完全相同return。這些功能稱為生成器。
function* foo() {
return 'test';
}
// Logs an object.
console.log(foo());
// Logs 'test'.
console.log(foo().next().value);
添加回答
舉報