如何防止Bluebird的警告:承诺是在处理程序中创建的,但未从中返回

时间:2016-06-13 18:44:37

标签: javascript promise bluebird

所以我有这段代码:

profileRepository.get(profileUuid).then((profile) => {
  if (profile.fileUuid) {
    profileStore.getFile(profile.fileUuid).then((fileData) => {
      data.fileData = fileData;
    }, callback);
  }

  data.profile = profile;
}, callback);

我收到了警告:

Warning: a promise was created in a handler but was not returned from it

我相信这种情况正在发生,因为profileStore.getFile()也会回复承诺。现在一般来说,摆脱这种警告的方法是链接then(),做更像的事情:

profileRepository.get(profileUuid).then((profile) => {
  if (profile.fileUuid) {
    return profileStore.getFile(profile.fileUuid);
  }

  data.profile = profile;
}, callback)
.then((fileData) => {
  data.fileData = fileData;
}, callback);

问题是我必须有条件地调用profileStore.getFile()所以我不知道如何在这种情况下使用然后链接,我也没有看到以任何其他方式重新编写此代码的方法来防止发生的警告。我在return null成功回调中尝试了get(),但这甚至没有阻止警告。

警告只是导致我的控制台日志填满,当我需要进行调试和填充时,它真的很烦人,有没有办法知道这个用例防止这个警告的方法?

更新

我也尝试过同样的警告:

profileRepository.get(profileUuid).then((profile) => {
  if (profile.fileUuid) {
    return profileStore.getFile(profile.fileUuid);
  }

  data.profile = profile;
}, callback)
.then((fileData) => {
  data.fileData = fileData;
}, callback);

1 个答案:

答案 0 :(得分:0)

  

问题是我必须有条件地调用profileStore.getFile()所以我不知道在这种情况下如何使用then链接

您不需要在这里使用链接。但是如果你在return回调中做异步,你总是需要then承诺,否则外部承诺不会等待(并且你不希望这样)。

在您的情况下,您可以从回调中返回一个无承诺,以便它等到data.fileData被分配:

return profileRepository.get(profileUuid).then(profile => {
  data.profile = profile;
  if (profile.fileUuid)
    return profileStore.getFile(profile.fileUuid).then(fileData => {
      data.fileData = fileData;
    });
}).then(() => data, callback);