我有这段代码:
export const photos_pipeline = (
images_at_time,
only_those_missing,
resize_photos,
remote_analysis,
persist_to_realm
) => {
const pull = (after = null) => {
const query =
after !== null
? {first: images_at_time, assetType: 'Photos', after}
: {first: images_at_time, assetType: 'Photos'};
CameraRoll.getPhotos(query).then(({edges, page_info}) =>
only_those_missing(edges)
.then(resize_photos)
.then(remote_analysis)
.then(persist_to_realm)
.then(() => {
if (page_info.has_next_page === true) pull(page_info.end_cursor);
else return;
})
);
};
return Promise.resolve(pull());
};
我希望将其作为Promise完成,也就是说,我希望在所有递归上有效地加入,但我不清楚正确的方法是什么。
我知道尾随的Promise.resolve是一个已经解决的Promise,也许它应该是new Promise
但是并没有解决加入所有递归的问题。现在尝试在结果上有一个累加器数组,然后是Promise.all,但在此期间发布。
感谢。
编辑:没有蓝鸟或任何东西,但原生的承诺。答案 0 :(得分:3)
您需要让pull()
函数返回其承诺链。
然后您可以调用该函数并返回其承诺;你不需要做任何其他事情。
您还需要在递归调用时返回它,否则您的then()
回调实际上不会等待它。
答案 1 :(得分:1)
你需要先返回CameraRoll.getPhotos(...)的结果,以便pull返回一个promise(这将消除返回Promise.resolve(pull())的需要;你可以让它返回pull ();
你还需要确保当你在拉动时递归时,再次将它返回到处理程序中,这样CameraRoll.getPhotos()返回的promise将在解析之前等待递归解析。
因此是这样的:
const pull = () => {
return CameraRoll.getPhotos().then(...
return pull(...);
});
};
return pull();