我有这个 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_xmlhttpRequest
和 setTimeout
在最低级别,然后只链接你的 promise 。通过 return
从 then
回调中返回递归调用的结果,生成的 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/