2017-08-28 147 views
0

我正在尋找循環承諾函數,直到我有我想要的結果。循環,直到承諾函數給出結果

截至目前我使用遞歸性是這樣的:

function pull() { 
    dataFactory.pullFunction().then(function(res) { 
     pull()  
    }) 
} 

但是,這讓我對我的例如加載條一些前端/風格的bug。

我會做這樣的事情:

function pull() { 
    while (res.status == 'ONGOING') { 
     dataFactory.pullFunction().then(function(res) { 
      // my stuffs 
     }) 
    } 
} 

但是當我嘗試它的pullFunction()不會被調用。

+1

'而(res.status == '正在進行')' - 是一個嚴密的循環,如果爲真將永遠不會允許任何異步代碼運行,並且如果false將永不會變爲真 –

+1

也許你應該更詳細地描述你想要做什麼。 – Robert

+0

感謝您的回答,我編輯了我的問題 – PAscalinox

回答

0

只需創建一個isOngoing變量

let isOngoing = false; 
function pull() { 
    isOngoing = true; 
    dataFactory.pullFunction() 
    .then(res => { 
     if(<your-condition>) { 
     isOngoing = false; 
     } else { 
     pull(); 
     } 
    }) 
} 

編輯

你處理異步操作在這裏,你不能與傳統的whilefor循環迴路它。除非您的環境允許您使用async/await功能。

async function pull() { 
    while (res.status == 'ONGOING') 
     await dataFactory.pullFunction().then(function(res) { 
      // my stuffs 
     }) 
} 
+0

感謝您的回答@jkris但我不希望使用遞歸性 – PAscalinox

+0

可惜我不能使用地等待着angularjs ... – PAscalinox

1

如果你不能使用async/await那麼你必須使用一個自己調用的函數。這不是真正的遞歸,因爲調用堆棧不像通常的(同步)遞歸那樣構建。

但是,你需要堅持承諾一路。所以返回的承諾,並繼續使用then,也在pull在您的其他代碼的初始調用。

也許你也想收集你從你的拉數據塊到一個數據集。

我會在這裏假設響應對象將具有數據塊的數據屬性。

這裏是如何可能會工作(與虛擬執行pullFunction的):

function pull() { 
 
    return (function loop(data) { 
 
     return dataFactory.pullFunction().then (res => { 
 
      return res.status === 'ONGOING' 
 
       ? loop(data.concat(res.data)) 
 
       : data.concat(res.data) 
 
     }); 
 
    })([]); 
 
} 
 

 
// Mock implementation 
 
var dataFactory = { 
 
    pullFunction: function() { 
 
     console.log('pull'); 
 
     return new Promise(resolve => { 
 
      setTimeout(_ => 
 
       resolve({ 
 
        status: Math.random() > 0.7 ? 'DONE' : 'ONGOING', 
 
        data: [1,2,3,4] 
 
       }), 
 
      500) 
 
     }); 
 
    } 
 
} 
 

 
// test it 
 
pull().then((data) => { 
 
    console.log('data: ', data); 
 
});
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

喜歡你如何能夠保持調用方法簡潔的方式!你提到'真正的遞歸',你能指導我到哪裏去找到這樣的學習資源。 – jkris

+0

我對你沒有任何的參考,但要注意的是,當'loop'從'return'的表達式中調用,loop'的'以前的呼叫已經完成:只有經過通話結束後 - 一段時間後 - 是'然後'調用回調。所以沒有時刻你有兩個未完成的'loop'調用實例。這是因爲這些呼叫是異步發生的。在真正的遞歸調用同步發生,所以loop'的'調用會然後疊加起來:當最深的通話結束,前面的一個繼續,...等等。這不是在這裏發生的。 – trincot