繁体   English   中英

递归函数中的 JavaScript promise

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM