3 回答
TA贡献1846条经验 获得超7个赞
返回值将永远是一个承诺。如果您未明确返回承诺,则返回的值将自动包装在承诺中。
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函数中返回了对某个值的承诺,您将收到该值的承诺(而不是该值的承诺)。
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));
在我的提要中,该行为的确与传统的return语句不一致。看起来,当您从异步函数中显式返回非承诺值时,它将强制将其包装在Promise中。我没有什么大问题,但是它确实违背了普通的JS。
ES6的函数返回的值与并不完全相同return。这些功能称为生成器。
function* foo() {
return 'test';
}
// Logs an object.
console.log(foo());
// Logs 'test'.
console.log(foo().next().value);
添加回答
举报