试图在javascript中找出承诺

时间:2017-03-08 22:13:56

标签: javascript promise

我正在阅读this article并且我已经达到了这段代码:

const wait = time => new Promise((resolve) => setTimeout(resolve, time));
wait(3000).then(() => console.log('Hello!')); // 'Hello!'

不幸的是,这个例子并没有真正帮助我理解每个人都在谈论的这种承诺的力量。我想知道上述代码和这个代码之间的区别是什么 -

setTimeout(() => { console.log('Hello!'); },3000);

1 个答案:

答案 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"。如果你没有这样做,任何抛出异步回调的异常都可能被系统默默地吃掉。