我读到用async关键字标记的异步函数隐式返回一个promise:
async
async function getVal(){ return await doSomethingAync(); } var ret = getVal(); console.log(ret);
但这不连贯…假设doSomethingAsync()返回一个诺言,而await关键字将从诺言中返回值,而不是诺言itsef,那么我的getVal函数 应该 返回该值,而不是隐式诺言。
doSomethingAsync()
那到底是什么情况?用async关键字标记的函数是隐式返回promise还是控制它们返回的内容?
也许,如果我们不明确地返回某些东西,那么他们会隐式地返回一个诺言…?
更清楚地说,上述内容与
function doSomethingAync(charlie) { return new Promise(function (resolve) { setTimeout(function () { resolve(charlie || 'yikes'); }, 100); }) } async function getVal(){ var val = await doSomethingAync(); // val is not a promise console.log(val); // logs 'yikes' or whatever return val; // but this returns a promise } var ret = getVal(); console.log(ret); //logs a promise
在我的提要中,该行为的确与传统的return语句不一致。似乎当您从async函数显式返回非承诺值时,它将强制将其包装在Promise中。我没有什么大问题,但是它确实违背了普通的JS。
返回值永远是一个承诺。如果您未明确返回承诺,则您返回的值将自动包装在承诺中。
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。
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。这些功能称为生成器。
return
function* foo() { return 'test'; } // Logs an object. console.log(foo()); // Logs 'test'. console.log(foo().next().value);