簡體   English   中英

未捕獲的 SyntaxError:await 僅在異步函數中有效(盡管它在異步函數中......)

[英]Uncaught SyntaxError: await is only valid in async function (its in an async function though…)

所以我不知道是什么導致了這個問題,我花了至少 30 分鍾搜索谷歌並嘗試不同的東西,但沒有解決方案。 我已經定義了一個async函數,我試圖在它里面使用await但它給了我

錯誤:未捕獲的語法錯誤:等待僅在異步函數中有效

這是代碼:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
async function SolveRecaptchaV2(APIKey, googleKey, pageUrl, proxy, proxyType){
            var requestUrl = "https://2captcha.com/in.php?key=" + APIKey + "&method=userrecaptcha&googlekey=" + googleKey + "&pageurl=" + pageUrl + "&proxy=" + proxy + "&proxytype=";

            switch (proxyType) {
                case 'HTTP':
                requestUrl = requestUrl + "HTTP";
                break;

                case 'HTTPS':
                requestUrl = requestUrl + "HTTPS";
                break;

                case 'SOCKS4':
                requestUrl = requestUrl + "SOCKS4";
                break;

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

                        for(var i=0; i<24; i++){
                            var ansUrl = "https://2captcha.com/res.php?key=" + APIKey + "&action=get&id=" + captchaID;  

                            $.ajax({url: ansUrl, success: function(ansresult){
                                    console.log(ansresult);
                                    if(ansresult.length < 3){
                                        return ansresult;
                                    }else{
                                        if(ansresult.substring(0, 3) == "OK|"){
                                            return ansresult;
                                        }else if (ansresult != "CAPCHA_NOT_READY"){
                                            return ansresult;
                                        }
                                    }
                                }
                            });
                            await sleep(1000);
                        }

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

        }

編輯:: 現在,當我將 $.ajax 回調函數設為異步函數時,$.ajax 調用都不起作用,並且我在其中創建的任何 console.log 都不會顯示在控制台中......我沒有收到任何錯誤雖然

所以這里的主要問題是,你在$.ajax函數的成功函數中使用 await(這是不可能的,如果不使這個函數也異步,但現在因為你的代碼混合了回調/異步,你不是能夠解決SolveRecaptchaV2的原始承諾。您將異步與舊回調混合在一起。)您的代碼本質上是在做:

SolveRecaptchaV2 => Ajax Request => Ajax Request Done, Firing callback
                         V                         V
                     Returning         Returning (But nothing cares about this return)

如果您使用 async 函數,請嘗試盡可能多地使用 async。 $.ajax將返回一個 promise,因此我們可以等待它,並保持我們的函數完全異步:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function SolveRecaptchaV2(APIKey, googleKey, pageUrl, proxy, proxyType){
    var requestUrl = "https://2captcha.com/in.php?key=" + APIKey + "&method=userrecaptcha&googlekey=" + googleKey + "&pageurl=" + pageUrl + "&proxy=" + proxy + "&proxytype=";

    switch (proxyType) {
        case 'HTTP':
        requestUrl = requestUrl + "HTTP";
        break;

        case 'HTTPS':
        requestUrl = requestUrl + "HTTPS";
        break;

        case 'SOCKS4':
        requestUrl = requestUrl + "SOCKS4";
        break;

        case 'SOCKS5':
        requestUrl = requestUrl + "SOCKS5";
        break;
    }   
    try {
        await result = await $.ajax({url: requestUrl});

        if(result.length < 3) {
            return false;
        } else {
            if(result.substring(0, 3) == "OK|") {
                var captchaID = result.substring(3);

                for(var i=0; i<24; i++){
                    var ansUrl = "https://2captcha.com/res.php?key=" + APIKey + "&action=get&id=" + captchaID;  

                    var ansResult = await $.ajax({url: ansUrl});
                    console.log(ansResult);
                    if(ansResult.length < 3) {
                        return ansResult;
                    } else {
                        if(ansresult.substring(0, 3) == "OK|") {
                            return ansResult;
                        } else if (ansResult != "CAPCHA_NOT_READY") {
                            return ansResult;
                        }
                    }
                    await sleep(1000);
                }
            } else {
                // ansResult is not defined here, not sure what you want to return here (May want to return false, or an empty string):
                return ansResult;   
            }
        }
    } catch (err) {
        //On ajax failure, return empy string. (May want to return false here, to fall inline with your "if (result.length < 3)" statement above.)
        return "";
    }
}

現在我們的鏈看起來像這樣:

SolveRecaptchaV2 => Ajax Request
                     => Ajax Request Done
                       => Get Answer URL
                         => Sleep
                           => Get Answer URL
                             => Sleep (...loop)
                               => Resolve promise of SolveRecaptchaV2.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM