webentwicklung-frage-antwort-db.com.de

Nicht abgerufener SyntaxError: await ist nur in der async-Funktion gültig (allerdings in einer async-Funktion ....)

Ich habe also keine Ahnung, was dieses Problem verursacht, und ich habe mindestens 30 Minuten damit verbracht, Google zu suchen und verschiedene Dinge auszuprobieren, ohne eine Lösung zu finden. Ich habe eine async-Funktion definiert und versuche, await darin zu verwenden, aber es gibt mir die 

Fehler: Unrecept SyntaxError: await ist nur in der async-Funktion gültig

Hier ist der Code:

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 "";
                }
            });

        }

EDIT :: Wenn ich nun die $ .ajax Callback-Funktion zu einer asynchronen Funktion mache, funktionieren keine der $ .ajax-Aufrufe, und alle Console.logs, die ich in ihnen mache, werden nicht in der Konsole angezeigt ... Ich bekomme keine Fehler obwohl

4
Olof

Das Hauptproblem hier ist also, dass Sie in der Erfolgsfunktion von $.ajax function Erwarten verwenden (Dies ist nicht möglich, ohne diese Funktion ebenfalls asynchron zu machen, aber jetzt, da Ihr Code Callbacks/Async mischt, ist dies nicht möglich Löse das ursprüngliche Versprechen von SolveRecaptchaV2. Du mischst async mit alten Rückrufen.) Dein Code macht im Wesentlichen:

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

Wenn Sie async-Funktionen verwenden, versuchen Sie async so weit wie möglich zu verwenden. $.ajax wird ein Versprechen zurückgeben, sodass wir darauf warten können und unsere Funktion vollständig asynchron halten:

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 "";
    }
}

Nun sieht unsere Kette so aus:

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