javascript - promise 不返回请求的值(value)

标签 javascript promise request tampermonkey gm-xmlhttprequest

我有这个 promise :

function getAPI(token)
{
return new Promise((resolve, reject) => {
    console.log("Request API");
    GM_xmlhttpRequest({
        method: "GET",
        url: "URL"+token,
        onload: function(response) {
            console.log(response.responseText);
            if( response.responseText == "NOT_ANSWER" || response.responseText.indexOf("ERRO") > -1 ){
                console.log(response.responseText + " - Calling Myself in 5 Seconds");
                setTimeout(function(){
                    getAPI(token);
                },5000);
            }
            else{
                console.log('Call API - Giving Result');
                resolve(response.responseText.split("_")[1]);
            }
        }
    });
});

当答案不是我想要的,但不能少于 5 秒时,我将其称为内部。

然后我在主函数中这样做:

setTimeout( function(){
                getAPI(token).then((key) => {
                    console.log(key);
                    doSomethingWithKey;
                    setTimeout( function(){
                        loop();
                    },1000);
                }).catch(() => {
                    console.log('Error na api - reload page!');
                    location.reload();
                });
            },25000);

但我注意到,当 getAPI 调用自身时导致答案不是我想要的,主函数中的“.then”永远不会执行,我的代码卡在那里。我该如何解决?我不太了解 promise ,但我不明白为什么它会挂起......

最佳答案

I call it inside of itself when the answer is not what i want,

然后你不调用从顶部 getAPI 调用返回的 promise 的 resolve,所以 promise 永远不会解决,你的 then 回调永远不会得到任何结果。

你应该 promisify你的异步函数 GM_xmlhttpRequestsetTimeout 在最低级别,然后只链接你的 promise 。通过 returnthen 回调中返回递归调用的结果,生成的 promise 将解析为相同的结果:

function xhrAsync(url) {
    return new Promise((resolve, reject) => {
        GM_xmlhttpRequest({
            method: "GET",
            url: url,
            onload: resolve
        });
    });
}
function delayAsync(time) {
    return new Promise(resolve => {
        setTimeout(resolve, time);
    });
}
function getAPI(token) {
    console.log("Request API");
    return xhrAsync("URL"+token).then(response => {
//  ^^^^^^                       ^^^^
        console.log(response.responseText);
        if (response.responseText == "NOT_ANSWER" || response.responseText.includes("ERRO")) {
            console.log(response.responseText + " - Calling Myself in 5 Seconds");
            return delayAsync(5000).then(() => {
//          ^^^^^^                  ^^^^
                return getAPI(token);
//              ^^^^^^
            });
        } else {
            console.log('Call API - Giving Result');
            return response.responseText.split("_")[1];
        }
    });
}

关于javascript - promise 不返回请求的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47002027/

相关文章:

javascript - AngularJS Accordion is-open 检查与 ng 重复

javascript - Firebase,异步检索数据

promise - save() 完成前的 Sequelize 回调

javascript - Node.js 中的对象字面量会阻塞吗

node.js - 使用node.js请求模块获取带有FileCookieStore的页面

javascript - 如何从输入到其他div的html标签调用 Controller 函数

javascript - 暂时禁用 "viewchangeend"事件

javascript - AngularJS:ng-if 超出 ng-repeat 会破坏 ng-repeat

node.js - 将 HTTP 请求导出为模块函数 Node.js

java - 在 HTTP 请求 header 中插入用户凭据