【问题标题】:Regressive call in promise承诺中的回归调用
【发布时间】:2018-02-24 21:38:59
【问题描述】:

是否有任何简单的方法可以使用 promise 进行递归调用。这是我的示例。

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)方式。

非常欢迎。

【问题讨论】:

  • 不需要Q,你可以使用new Promise(...),你可以使用async/awaitfor(...)循环中链接你的请求。
  • 这种情况下我如何使用for循环,仅基于上一个调用我将决定是否需要进行下一个调用或需要解决它。
  • 看我的回答。它显示了我的想法。

标签: node.js promise q


【解决方案1】:

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

【讨论】:

  • 我认为应该可以。看看,有没有更好的办法。谢谢
  • “更好的方法”是什么意思?
  • 我期待其他人的更多建议
  • “更好的方法”是什么意思? bcz async 和 await 支持节点 v8。有没有其他支持所有版本的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 2019-03-10
  • 2020-01-24
  • 2023-03-28
  • 2021-11-21
  • 2014-06-14
  • 2018-10-11
相关资源
最近更新 更多