为了账号安全,请及时绑定邮箱和手机立即绑定

递归循环一个承诺?

递归循环一个承诺?

森林海 2021-12-23 16:50:21
我从 DigitalOcean API 获得了一个液滴列表,但液滴列表是每页的。响应为您提供页面上和下一页上的液滴列表...我试图递归地获取每个承诺的下一页:getDropletsPerPage(command,firstPage).then((response)=>{    nextPage= response['nextPage']    droplets= response['droplets']    getDropletsPerPage(command, nextPage).then((response)=>{        nextPage= response['nextPage']        droplets= response['droplets']        getDropletsPerPage(command, nextPage).then((response)=>{            nextPage= response['nextPage']            droplets= response['droplets']            // Repeat until last page..        })    })})
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

你可以使用递归:


const dispatcher = {

    page: firstPage,

    droplets: [],

    execute: function () {

        const self = this;

        return new Promise(function (resolve, reject) {

            getDropletsPerPage(command, this.page).then(function (response) {

                self.page = response['nextPage'];

                self.droplets = self.droplets.concat(response['droplets']);

                if (nextPage === LAST_PAGE) {

                    resolve(true);/* done */

                } else {

                    self.execute().then(function () {

                        resolve(true);

                    });

                }

            });

        });

    }

}

dispatcher.execute().then(function() {

    /* reached last page */

});


查看完整回答
反对 回复 2021-12-23
?
哔哔one

TA贡献1854条经验 获得超8个赞

一个简单的方法来做到这一点:


    async getDropletsList(command, dropletsList, currentPage) {

        if(!currentPage) return dropletsList // here you've to check if there is another valid page

        const { nextPage, droplets } = await getDropletsPerPage(command, currentPage)

        dropletsList = dropletsList.concat(droplets)

        return getDropletsList(command, dropletsList, nextPage) // recursive call

    }

希望对你有帮助:D


查看完整回答
反对 回复 2021-12-23
?
慕森王

TA贡献1777条经验 获得超3个赞

如果您的目标是从所有页面收集液滴信息,您可以将数据累积在一个数组中,该数组作为参数传递给递归函数的每个后续调用(直到到达最后一页):


const getDroplets = (page, droplets = []) => {

  if (/* end of the pagination is reached */) {

    return Promise.resolve(droplets);

  }

  return getDropletsPerPage(command, page).then((response) => {

    return getDroplets(

      response.nextPage,

      droplets.concat(...response.droplets)

    );

  })

};


getDroplets(firstPage).then(droplets => {

  console.log(droplets);

});


查看完整回答
反对 回复 2021-12-23
  • 3 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号