我们可以通过回调和承诺实现相同的目标吗?如果可以的话,为什么要使用其中一个而不是另一个?
除了您提到的原因之外,您还可以存储承诺并在代码中的其他地方使用它。 Promise 还遵循更加面向对象的范例。
(不基于意见:)
在长长的异步操作链中,使用简单的回调将错误正确传播回调用站点几乎是不可能的,而不需要重新发明诸如 Promise 之类的东西。
如果您在常规回调中
throw
,错误会去哪里?比较:
setTimeout(() => { throw new Error("Fail"); }, 1000);
与
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
wait(1000)
.then(() => { throw new Error("Fail"); })
.catch(e => console.log("Caught: " + e)); // Caught: Error: Fail
在前一种情况下,它会在 JS 不知情的情况下直接进入浏览器的控制台,而在后一种情况下,它会被 JS 捕获,从而可以采取纠正措施。
在没有承诺的情况下正确地传播错误通常需要
try {} catch() {}
在代码中的每个回调周围使用传播魔法,这是我从未见过的。
我喜欢 Promise 有两个原因。第一个是解析 Promise 对象的代码通过 .then() 和 .catch() 块发生在 Promise 对象本身内部,对我来说,这似乎是容纳解析对象的代码的最佳位置。第二个是我发现 .then() 块更具表现力,因为您可以在对象内部看到对象应该是什么以及在解析时执行的操作。
这只是我的意见,归根结底,使用你喜欢的/你的老板喜欢的/你的团队更喜欢的东西,因为他们都用不同的语法做同样的事情。