如何在 Javascript 中使用异步等待函数对象?

Posted

技术标签:

【中文标题】如何在 Javascript 中使用异步等待函数对象?【英文标题】:How to use async await function object in Javascript? 【发布时间】:2016-03-16 14:45:49 【问题描述】:

假设我有一个函数对象-

setObj : function(a,b)
    obj.a = a;
    obj.b = b;

如果我必须在这个函数对象上使用 async & await,我该怎么做?

如果同样写在function(函数方式)中,说-

async function setObj(a,b)
    obj.a = a;
    obj.b = b;


await setObj(2,3);

这很好用。但是,如果是函数对象,我该怎么做呢?

【问题讨论】:

【参考方案1】:

在对象的属性中使用相同的 async 关键字:

(async function () 
  var obj = ;
  console.log("hello");

  let setObj = async function (a,b)
    obj.a = a;
    obj.b = b;
  ;

  await setObj(2,3);

  console.log(obj.a+obj.b);
)();

请注意,整个代码都包装在一个异步自调用函数中。这是必需的,否则await setObj 将无法正常运行。

【讨论】:

我试过这种方法,我得到一个错误,说缺少分号。看看我的代码-gist.github.com/bozzmob/f5ef1c0eff9d7e7f853d setObj 是对象内部的属性吗?例如:let someFunctions = setObj: async function (a, b) ...;。您的代码不会按要点运行,因为您在对象之外使用冒号。或者,您可以让 setObj = async function (a, b) ...; 请检查同一链接上的“更新 1”(gist.github.com/bozzmob/f5ef1c0eff9d7e7f853d) 仍然面临同样的问题。 还有“更新 2”。我已经尝试了您所说的两种解决方案。请问您可以在此处使用有效的解决方案更新您当前的答案吗?【参考方案2】:

如果我正确理解您的问题,您可以在方法声明前使用async 关键字:

let obj = ;
let myObj = 
    async setObj(a,b) 
        obj.a = a;
        obj.b = b;
    

见http://tc39.github.io/ecmascript-asyncawait/#async-methods

更新

您不能在异步函数之外使用await。为了使用它,您必须将该调用包装到await setObj(2, 3)

async function consoleLog() 
    await myObj.setObj(2, 3);
    console.log(obj.a + obj.b);


consoleLog();

【讨论】:

它说缺少 : 在属性 id 之后。这是我尝试过的-gist.github.com/bozzmob/a36f0d28310df88f0a5d 在您的 Gist 中,将 async 关键字移到 ":" 之后的 "function" 前面 在您的 Gist 中查看我的 cmets,您使用的“await”关键字错误,它必须在异步函数中。 请查看要点中的“更新 1”。我在进行更改时收到以下错误 - SyntaxError: missing after property list. 你可以使用 Babel REPL 来试试这个,我已经为你设置好了:tinyurl.com/zzvrzmv【参考方案3】:

您可以简单地将async 关键字放在任何函数上,不仅是函数声明,还包括函数表达式和对象的方法。例如:

作为对象的方法:

const Object = 
    async asyncFunction() 
        await MyExamplepromise
    

作为变量:

const myFunc = async function ()  await MyExamplepromise 

// this is how execute the function expression
// first () operator to execute, and use .then get access the resolved value
myFunc().then((val) =>  console.log(val) )

还要注意异步函数返回一个承诺,该承诺将使用异步函数返回的值解析,或者被异步函数中抛出的未捕获异常拒绝。

【讨论】:

【参考方案4】:

使用箭头函数也可以

const myObject = 
   myFunc: async () => 
     await myResultHere
   

使用这个:由于该函数是一个异步函数,它将异步运行。如果你想用 await 运行它,你必须在异步函数中使用它

const useFunc = async () => 
   const res = await myObject.myfunc();
 

【讨论】:

以上是关于如何在 Javascript 中使用异步等待函数对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何等待函数在javascript中完成?

JavaScript在if语句中等待异步函数[重复]

如何等待异步函数执行?

Javascript异步等待不等待猫鼬等待

JavaScript(异步)如何确定在继续之前要“等待”啥?

异步 - 等待 JavaScript:无法从错误对象中捕获错误详细信息 [重复]