在里面返回一个承诺然后不起作用

时间:2017-05-13 12:39:48

标签: javascript promise bluebird

我正在使用bluebird作为我的Promise libaray。我有以下链:

function a() {
  return Promise.all([promise1, promise2]).then((results) => {      
      return promise3(results)
  })
}

但是我无法得到promise3的结果,我的意思是以下不起作用:

a().then((result) => {
    console.log(result)
}).catch((err) => {
    console.error(err)
})

我搜索并阅读了有关承诺但我无法理解问题出在哪里?

1 个答案:

答案 0 :(得分:7)

这可能有几个原因,无法确定帖子中的哪一个。所以为了帮助未来的读者 - 让我们弄清楚在上面的场景中会出现什么问题:

让我们对代码进行以下调整:

function a() {
  console.log("a called"); // if this doesn't log, you're redefining 'a'
  return Promise.all([promise1, promise2]).then((results) => {
      console.log("In .all"); // if this isn't called, promise1 or promise2 never resolve      
      return promise3(results);
  }).tap(() => 
    console.log("Promise 3 fn resolved") // if this doesn't log, promise3 never resolves
  });
}

然后,我们的then处理程序:

let r = a().then((result) => {
    console.log('result', result); // this logs together with promise 3 fn
}); // bluebird automatically adds a `.catch` handler and emits unhandledRejection

setTimeout(() => {
  // see what `r` is after 30 seconds, if it's pending the operation is stuck
  console.log("r is", r.inspect()); 
}, 30000);

这应该让你全面覆盖可能出错的所有案例。

如果我不得不猜测 - 其中一个承诺永远无法解决,因为你的某个Promise构造函数永远不会调用resolvereject

(Bluebird会在某些情况下警告你不要这样做 - 确保你有警告)

可能导致这种情况的另一种情况是取消 - 但我假设你没有打开它。

快乐的编码。