我正在阅读this article并且我已经达到了这段代码:
const wait = time => new Promise((resolve) => setTimeout(resolve, time));
wait(3000).then(() => console.log('Hello!')); // 'Hello!'
不幸的是,这个例子并没有真正帮助我理解每个人都在谈论的这种承诺的力量。我想知道上述代码和这个代码之间的区别是什么 -
setTimeout(() => { console.log('Hello!'); },3000);
答案 0 :(得分:1)
您展示的两个示例之间没有功能差异 - 它们会产生相同的结果。您的承诺示例只是告诉您如何使用setTimeout()
的承诺。
当你有更复杂的场景,例如你想要协调的多个异步操作,顺序异步操作,异步操作中的错误处理等等时,承诺的力量就来了......你展示的例子可能是最简单的使用承诺因此,它不会展示它的功能或更有价值的使用场景。
以下是承诺大大有用的一些场景:
使用正确的错误处理对多个异步操作进行排序
doSomethingAsync1().then(doSomethingAsync2).then(doSomethingAsync3).then(results -> {
// handle final result here
}).catch(err => {
// handle error here
});
协调多个异步操作,以便您可以并行运行它们并知道它们何时完成
Promise.all(doSomethingAsync1(), doSomethingAsync2(), doSomethingAsync3()).then(results => {
// all results available here
}).catch(err => {
// handle error here
})
处理复杂的异步错误情况
doSomethingAsync1().then(result1 => {
if (result1 passes some condition) {
return doSomethingAsync2().then(r => {
// process result here
});
} else {
return doSomethingAsync3().then(r => {
// process result here
});
}
}).catch(err => {
// all async errors will propagate to here
});
啊,所有这些.then()
处理程序都是"抛弃安全"这意味着如果在任何异步.then()
处理程序中发生异常,它将自动被捕获并转变为被拒绝的承诺,这可以在我的所有示例中的.catch()
处理程序中轻松处理。尝试使用常规回调编写该代码(无承诺)。您必须在每次回调时自己设置try / catch,以便然后使用" throw-safe"。如果你没有这样做,任何抛出异步回调的异常都可能被系统默默地吃掉。