【问题标题】:How to use async await function object in Javascript?如何在 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);

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

【问题讨论】:

    标签: javascript async-await babeljs ecmascript-next


    【解决方案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();
      } 
      

      【讨论】:

        猜你喜欢
        • 2017-06-18
        • 2020-11-11
        • 2019-07-17
        • 1970-01-01
        • 2018-09-29
        • 2011-03-04
        • 2022-01-01
        • 2019-10-26
        相关资源
        最近更新 更多