如何让递归函数接收承诺等待?

How to get recursive function receiving promises to wait?

我正在尝试从数据库中获取信息,其中的信息来自多个页面,所有信息都需要编译到一个数组中。

但是,即使我在 .then 中处理 promise 并且我使用 .then 递归调用该函数,它仍然不会等待并在我可以获取它之前期待“下一页”数组.

相关代码如下:

function getAllPersonEvents(jobID, pageNum) {
   getPersonEvents(jobID, pageNum).then(function(val){
      if (val.length < 100) {
         console.log(val);
         console.log("above returned");
         return val;
      } else {
         console.log("expecting return!");
         let nextPages = getAllPersonEvents(jobID, pageNum + 1);
         console.log(nextPages);
         let allEvents = val.concat(nextPages);
         console.log(allEvents);
         return allEvents;
      }
   });
}

function getPersonEvents(jobID, pageNum) {
   return fetch('WORKING FETCH URL' + pageNum + '&job_ids[]=' + jobID, options)
   .then(response => response.json())
   .then(response => {
      return response.person_events;
   })
   .catch(err => console.error(err));
}

我如何到达“returned!”在“期待return!”之前编码部分?

你的 getAllPersonEvents 从来没有 return 什么。您的 then 处理程序会,但不会 getAllPersonEvents。为了执行您所描述的操作,您需要 return 一个将由数组实现的承诺。

坚持你的显式承诺回调,你可以这样做(见评论):

function getAllPersonEvents(jobID, pageNum) {
    // An array to build up our results in
    const all = [];
    // Get the initial events
    return getPersonEvents(jobID, pageNum).then((page) => {
        all.push(...page);
        if (page.length < 100) {
            // We have all of them, fulfill the promise with the full array
            return all;
        } else {
            // There may be more, recurse...
            return getAllPersonEvents(jobID, pageNum + 1).then((page) => {
                // ...and then add the results from the recursion to our
                // own, and fulfill this promise (which fulfills the main
                // one) with `all`.
                all.push(...page);
                return all;
            });
        }
    });
}

使用async/await写起来简单多了,不过:

function getAllPersonEvents(jobID, pageNum) {
    const all = [];
    let page;
    do {
        page = await getPersonEvents(jobID, pageNum++);
        all.push(...page);
    } while (page.length >= 100);
    return all;
}