为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

波斯汪 2019-10-16 14:32:40
我读到用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。
查看完整描述

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);


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 698 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信