来自$ .ajax的怪异行为

时间:2017-11-16 03:53:44

标签: javascript google-chrome google-chrome-extension

当我运行此代码时:

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;
        }
        console.log('here'); //this gets shown in console
        $.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;  

                        var requests = $.ajax({url: ansUrl});
                        requests.done(function(ansresult){
                            console.log(ansresult); //This gets shown in console
                            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 'not OK|';   
                }
            }
        },
        fail: function(){
            return "fail";
            }
        });

    }

当我运行此代码时一切正常并且代码运行没有问题,但是当我在$ .ajax中使用异步函数进行回调函数时,$ .ajax似乎无法运行。这是不运行的代码:

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;
        }
        console.log('here'); //This still shows in console.......
        $.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;  

                        var requests = $.ajax({url: ansUrl});
                        requests.done(async function(ansresult){
                            console.log(ansresult); //This does not show in console now.....
                            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 'not OK|';   
                }
            }
        },
        fail: function(){
            return "fail";
            }
        });

    }

注意第一个ajax调用之前的console.log和第二个ajax调用中的console.log。 ajax调用中的console.log没有出现......

1 个答案:

答案 0 :(得分:0)

Hooray,您在jQuery中发现了一个错误。 https://github.com/jquery/jquery/issues/3596

它忽略了作为回调传递的异步函数,因为它无法识别它们。

console.log(jQuery.isFunction(()=>{}))  // true
console.log(jQuery.isFunction(async ()=>{}))  // false

function deferred() {
  return $.ajax({url:"https://httpbin.org/ip"});  // returns a Deferred
}

async function native() {
  return $.ajax({url:"https://httpbin.org/ip"});  // returns a native promise
}

function demo() {
  deferred().then(async val=>console.log("doesn't work"));
  native().then(async val=>console.log('works'));
}
demo();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

由于您正在撰写Chrome扩展程序,因此您绝对可以使用它支持的所有JavaScript。

await $.ajax(…)(或使用fetch),不要担心jQuery的回调。

举个例子:

async function demo() {
  try {
    let result = await $.ajax({url:"https://httpbin.org/headers"});
    return result.headers['User-Agent'];
  } catch (err) {
    return 'fail';
  }
}
相关问题