Javascript, получающий пользовательские функции асинхронности и ожидания, для работы - PullRequest
0 голосов
/ 06 июля 2018

Я создаю свой собственный javascript SDK borwserside, используя webpack и node.

У меня есть простая функция аутентификации, которую я создал в моем SDK. это простая функция обратного вызова, которая запрашивает API и возвращает, если результат был успешным или нет в форме обратного вызова.

sdk.js

  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

<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 работает функция обратного вызова authenticate, но не работает версия аутентификации await / async в блоке try catch. Почему и как мне заставить это работать.

Я хочу, чтобы оба варианта работали.

Я получаю следующую ошибку. Который ссылается на блок catch и console.log (er).

TypeError: t не является функцией в t.value (index.js: 41)

1 Ответ

0 голосов
/ 07 июля 2018

Вы смешиваете две методологии callbacks и promises. Более мощным является использование promises, а асинхронные функции используют обещания, которые позволяют вам писать код на основе обещаний, как если бы он был синхронным, но без блокировки основного потока.

Асинхронные возвращаемые значения

Асинхронные функции всегда возвращают обещание, вы используете ждать или нет. Это обещание решается с любой асинхронностью функция возвращает или отвергает с тем, что выдает асинхронная функция.

Используйте обратный вызов вне асинхронной функции в then или catch.

sdk.js

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

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

Надеюсь, это поможет.

...