异步/等待隐式返回诺言?

我读到用async关键字标记的异步函数隐式返回一个promise:


async function getVal(){

 return await doSomethingAync();

}


var ret = getVal();

console.log(ret);

但这不连贯...假设doSomethingAsync()返回一个诺言,而await关键字将从诺言中返回值,而不是诺言itsef,那么我的getVal函数应该返回该值,而不是隐式诺言。


那到底是什么情况?用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。


波斯汪
浏览 669回答 3
3回答

喵喵时光机

返回值将永远是一个承诺。如果您未明确返回承诺,则返回的值将自动包装在承诺中。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: 4increment(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: 5incrementTwice(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: 4increment(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);
打开App,查看更多内容
随时随地看视频慕课网APP