2017-07-13 54 views
1

我有一個功能,我的應用程序必須執行多次分頁。但是,在第一次之後,解析不會再次執行。 我錯過了什麼嗎?Javascript承諾recusive功能

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"); 
       } 
     }) 
    }) 
} 

我在想什麼?任何幫助是極大的讚賞。

+0

你沒有真正傳播'Promise'是'myrequest'會回到你的時候窩。 – zero298

回答

3

像零表示你得通過在解析中返回來傳播遞歸承諾。

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)); 
+0

你是我的英雄夥計。在最後一個小時裏,我一直在撞牆。謝謝你,兄弟。只要我能接受,我會的 – basic

1

您沒有使用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"); 
    }); 
} 
+0

我更大的問題是我需要它在else子句中返回。我的列表直到else語句才完成。 – basic

+0

@basic我不明白你的評論。你是否嘗試過這段代碼而不工作? – lilezek

+0

問題已在其他海報答案中解決。謝謝你! – basic

2

myrequest(...);調用返回一個承諾,你是進一步執行這一承諾對象的監視器上,所以每當這個承諾得到解決,即返回對象的(然後/完成)處理程序將調用,但在遞歸調用myrequest(myurl);時,返回的結果(A promise)您沒有使用它,並且您正在失去該承諾(泄漏類型),顯然,即使該承諾已解決,沒有人會提到這一點,所以他們可以執行某些事情來聆聽解決。

1

你其實並不需要創建一個新的承諾與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 
     } 
    }); 
}