首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript使自定义异步和等待函数工作

Javascript使自定义异步和等待函数工作
EN

Stack Overflow用户
提问于 2018-07-06 17:26:14
回答 1查看 740关注 0票数 0

我正在构建自己的borwserside javascript sdk,使用的是webpack和node。

我在sdk中创建了一个简单的身份验证函数。这是一个简单的回调函数,用于查询api并以回调的形式返回结果是否成功。

sdk.js

代码语言:javascript
复制
  async authenticate(callback) {

        try {

            this.account = await this.repo.authenticate(this.product, this.origin);

            if (this.account.success === false) {
                return callback({
                    "success": false,
                    "response": "Failed To Authenticate"
                });
            }

            return callback({
                "success": true,
                "response": this.account
            });


        } catch (e) {

            return callback({
                "success": false,
                "response": e
            });

        }

    }

现在在我的浏览器中,我有一个索引文件。它将实例化对象并调用此函数。

index.html

代码语言:javascript
复制
<script>

hsp = new HSP();

// function called on button click
async function done() {

    // Works
    hsp.authenticate((res) => {
        console.log(res);
     });

     // DOES NOT WORK
    try {
        const auth = await hsp.authenticate();

        console.log(auth);

    } catch (er) {
        console.log(er);
    }

}

</script>

在上面的index.html示例中,身份验证的回调版本可以工作,但try catch块中的await/async版本的身份验证不能工作。为什么以及如何让它工作。

我希望这两个选项都能起作用。

我得到以下错误。它引用catch块和console.log(er)。

TypeError: t不是t.value (index.js:41)

的函数

EN

回答 1

Stack Overflow用户

发布于 2018-07-07 07:07:01

您混合了两种方法:callbackspromises。使用promises更强大,而且异步函数利用promise,它们允许您编写基于promise的代码,就像它是同步的一样,但不会阻塞主线程。

异步函数总是返回一个promise,无论您是否使用await。这个承诺解决了异步函数返回的任何问题,或者拒绝了异步函数抛出的任何问题。

在then或catch中的异步函数外部使用回调。

sdk.js

代码语言:javascript
复制
async authenticate() {

        try {

            this.account = await this.repo.authenticate(this.product, this.origin);

            if (this.account.success === false) {
                return {
                    "success": false,
                    "response": "Failed To Authenticate"
                };
            }

            return {
                "success": true,
                "response": this.account
            };


        } catch (e) {

            return {
                "success": false,
                "response": e
            };

        }

    }

index.html

代码语言:javascript
复制
<script>

hsp = new HSP();

// function called on button click
async function done() {

    // Works (Your callback here in then method)
    hsp.authenticate().then((res) => {
        console.log(res);
     }).cath( err => console.log(er));

     // It Will WORK (Make use of your callback outside of the async function)
    try {
        const auth = await hsp.authenticate();

        console.log(auth);

    } catch (er) {
        console.log(er);
    }

}

</script>

我希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51207175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档