[英]JavaScript promise in recursive function
我的应用程序中有一个函数必须多次执行以进行分页,但是在第一次执行后,resolve 再也不会执行。 我错过了什么吗?
function start(){
$.when(myrequest()).done(function(result){
console.log(result);
})
}
function myrequest(myurl){
//NOTE this is just an example but the idea is the same.
return new Promise(function(resolve, reject){
$.ajax({
url: myurl,
method: "GET",
contentType: "application/json",
headers:{
Authorization: key
},
success: function(response) {
if (response.currenturl !== response.lasturl) {
myurl = response.nexturl;
//Do stuff with data here as well to create a list.
myrequest(myurl);
//RESOLVES JUST FINE
resolve("test");
}else{
//DOESN'T RESOLVE
resolve("test");
}
},
error: function(response){
reject("error");
}
})
})
}
就像零说的那样,您必须通过在解析中返回它来传播递归承诺。
success: function(response) {
if (response.currenturl !== response.lasturl) {
myurl = response.nexturl;
//Do stuff with data here as well to create a list.
// *heres magic
resolve(myrequest(myurl));
你的myrequest(...);
调用返回一个承诺,并且在该承诺对象的监视器上您正在进一步执行,因此每当该承诺得到解决时,返回对象的(然后/完成)处理程序将调用,但在您的递归调用中myrequest(myurl);
,返回的内容(A promise
)你没有使用它,你正在失去那个 promise(有点泄漏),所以很明显,即使那个 promise 被解决了,也没有人对此有参考,所以他们可以执行一些事情聆听解决。
您没有使用myrequest
的递归结果(承诺)。
例如,您可以这样做:
if (response.currenturl !== response.lasturl) {
myurl = response.nexturl;
//Do stuff with data here as well to create a list.
$.when(myrequest(myurl)).done(function (result) {
//RESOLVES JUST FINE
resolve("test");
});
}
你实际上不需要用new Promise
创建一个新的承诺,因为$.ajax
已经返回了一个承诺。 此外,您不需要$.when
,它主要用于处理一系列承诺,但您只向它传递一个承诺。 相反,使用承诺的then
方法。
像这样:
function start(startUrl){
return myrequest(startUrl).then(function(result){
console.log(result);
});
}
function myrequest(myurl, collected = []){
return $.ajax({
url: myurl,
method: "GET",
contentType: "application/json",
headers:{
Authorization: key
}
}).then(function(response) {
if (response.currenturl !== response.lasturl) {
// add something to the partial results,
// e.g. the url, but could be response data:
collected.push(myurl);
//Do stuff with data here as well to create a list.
//...
// Also pass on the partial results:
return myrequest(response.nexturl, collected);
} else {
return collected; // return all the results
}
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.