2017-09-15 54 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

我期望别人提供更多建议 –