整个递归的结果是一个Promise

时间:2017-07-27 16:46:32

标签: javascript promise

我有这段代码:

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,但在此期间发布。

感谢。

编辑:没有蓝鸟或任何东西,但原生的承诺。

2 个答案:

答案 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();