2017-09-15 53 views
0

有沒有簡單的方法來使用承諾進行遞歸調用。這是我的樣品。承諾中的退化呼叫

function getData() { 
    var result=[]; 
    var deferred = Q.defer(); 
    (function fetchData(pageno){ 
    var options = { 
     method : 'GET', 
     url : 'example.com/test', 
     qs:{ 
      pageNo: pageno 
     } 
    } 

    request(options, function (error, response, body) { 
     if (error)throw new Error(error); 

     if (body.hasMorePage == true) { //checking is there next page 
      result.push(body) 
      fetchData(++body.pageno); // getting next page data 
     } else { 
      deferred.resolve(result); // promise resolve when there is no more page 
     } 
    }); 
    })(0); 
    return deferred.promise; 
} 


getData().then(function(data){ 
    console.log(data) 
}); 

讓我們考慮API在連續調用中提供更多數據。爲了收集所有數據,我需要使用前一個調用響應中的某個參數(EX:hasMorePage)。爲了獲得這種情況,我需要進行迴歸調用,但我想知道更好的(Promise)方式。

最受歡迎。

+0

無需'Q',你可以用'新希望(...)',你可以使用'async' /'await'到鏈您的請求(...)'循環。 – ideaboxer

+0

這種情況下,我如何使用for循環,基於前一次調用,我將決定是否需要下一次調用或需要解決它。 –

+0

看到我的答案。它顯示了我的想法。 – ideaboxer

回答

0

async function request(options, callback) { 
 
    // simulate server response of example.com/test with 1 second delay 
 
    const totalNumberOfPages = 3; 
 
    const pageNo = options.qs.pageNo; 
 
    await new Promise(resolve => setTimeout(resolve, 1000)); 
 
    const hasMorePages = pageNo < totalNumberOfPages; 
 
    const body = { hasMorePages }; 
 
    callback(void 0, { body }, body); 
 
} 
 

 

 
function getPage(pageNo) { 
 
    const options = { 
 
    method: 'GET', 
 
    url: 'example.com/test', 
 
    qs: { pageNo } 
 
    }; 
 
    return new Promise(resolve => request(options, (error, response, body) => { 
 
    console.log('response received', response); 
 
    if(error) { 
 
     throw new Error(error); 
 
    } 
 
    resolve(body); 
 
    })); 
 
} 
 

 
async function getData() { 
 
    const result = []; 
 
    for(let i = 1, hasMorePages = true; hasMorePages; i++) { 
 
     const body = await getPage(i); 
 
     result.push(body); 
 
     hasMorePages = body.hasMorePages; 
 
    } 
 
    return result; 
 
} 
 

 
getData().then(data => console.log('RESULT', data));

+0

我認爲它應該工作。將會看到,有沒有更好的方法。謝謝 –

+0

「更好的方式」是什麼意思? – ideaboxer

+0

我期望別人提供更多建議 –