函数的错误等待已包含异步

时间:2019-02-16 14:54:03

标签: javascript ajax async-await

我有此错误:等待仅在异步函数中有效

我的代码:

    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 :(得分:2)

您正在尝试在该ajax调用的await回调中使用success关键字,而不是在async function solve中使用关键字。使用承诺时,请勿使用successfail回调(通过使用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);

答案 1 :(得分:1)

将最外面的ajax调用更改为如下形式:

success: async function(result)

您在不是await的内部函数中使用async

答案 2 :(得分:0)

使用await关键字的函数必须是异步函数-您刚刚使父函数异步。

在ajax回调中,只需将success: function(更改为success: async function(