如何让递归函数接收承诺等待?
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;
}
我正在尝试从数据库中获取信息,其中的信息来自多个页面,所有信息都需要编译到一个数组中。
但是,即使我在 .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;
}