Ошибка ожидания с функцией уже содержит асинхронный - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть эта ошибка: ожидание допустимо только в асинхронной функции

Мой код:

    async function solve(){
                var requestUrl = "url";

                $.ajax({url: "requestUrl", success: function(result){
                    if(result.length < 3){
                        return false;
                    }else{
                        if(result.substring(0, 3) == "OK|"){
                            var ID = result.substring(3);

                            for(var i=0; i<24; i++){
                                var ansUrl = "url"+ID;  

                                $.ajax({url: "ansUrl", success: function(ansresult){
                                        if(ansresult.length < 3){
                                            return ansresult;
                                        }else{
                                            if(ansresult.substring(0, 3) == "OK|"){
                                                return ansresult;
                                            }else if (ansresult != "ERROR"){
                                                return ansresult;
                                            }
                                        }
                                    }
                                });
                                 await sleep(5000); // <-- ERROR
                            }

                        }else{
                            return ansresult;   
                        }
                    }
                },
                fail: function(){
                    return "";
                    }
                });

            }
 solve();

Функция не имела асинхронности, я поставил ее в начале, и все равно она все еще даетэта ошибка.Я не знаю, если это проблема в AJAX

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Функция, в которой вы используете ключевое слово await, должна быть асинхронной. Вы только что сделали родительскую функцию асинхронной.

В обратных вызовах ajax просто измените success: function( на success: async function(

0 голосов
/ 16 февраля 2019

Вы пытаетесь использовать ключевое слово await в обратном вызове success этого вызова ajax, а не в async function solve.Не используйте обратные вызовы success и fail при работе с обещаниями (подразумевается при работе с async / await)!

Вместо этого используйте обещание, которое $.ajax уже возвращает, awaitи напиши свой код без особого вложения:

async function solve() {
    try {
        const requestUrl = "url";
        const result = await $.ajax({url: requestUrl});
//                     ^^^^^
        if (result.length < 3) {
            return false;
        } else if (result.substring(0, 3) == "OK|") {
            const ID = result.substring(3);
            for (let i=0; i<24; i++){
                const ansUrl = "url"+ID;  
                const ansresult = await $.ajax({url: ansUrl});
//                                ^^^^^
                if (ansresult.length < 3) {
                    return ansresult;
                } else if(ansresult.substring(0, 3) == "OK|") {
                    return ansresult;
                } else if (ansresult != "ERROR") {
                    return ansresult;
                }
                await sleep(5000); // works here!
            }
        } else {
            return ansresult; // not in scope?!
        }
    } catch(e) {
        return "";
    }
}
solve().then(console.log);
0 голосов
/ 16 февраля 2019

Измените внешний вызов ajax, чтобы он выглядел следующим образом:

success: async function(result)

Вы используете await внутри этой внутренней функции, которая не async

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...