-
Promise 的用途
Promise 是 JS 异步编程的一种解决方案,可以解决异步编程中的回调问题。
Promise 对象的构造器(constructor)语法如下:
let promise = new Promise(function(resolve, reject) { // executor });当
new Promise被创建,executor 会自动运行并尝试执行一项工作。尝试结束后,如果成功则调用resolve,如果出现 error 则调用reject。 -
如何创建一个 new Promise
第一步:
-
return new Promise((resolve,reject)=>{...})
-
任务成功调用resolve(result), 任务失败则调用reject(error)
-
resolve和reject会调用成功函数和失败函数 第二步:
-
使用 .then(success,fail)传入成功函数和失败函数
-
如何使用 Promise.prototype.then
语法:
promise.then( function(result) { */* handle a successful result */* }, function(error) { */* handle an error */* } );.then的第一个参数是一个函数,该函数将在 promise resolved 后运行并接收结果。.then的第二个参数也是一个函数,该函数将在 promise rejected 后运行并接收 error。例,resolve:
let promise = new Promise(function(resolve, reject) { setTimeout(() => resolve("done!"), 1000); }); // resolve 运行 .then 中的第一个函数 promise.then( result => alert(result), // 1 秒后显示 "done!" error => alert(error) // 不运行 );例,reject:
let promise = new Promise(function(resolve, reject) { setTimeout(() => reject(new Error("Whoops!")), 1000); }); // reject 运行 .then 中的第二个函数 promise.then( result => alert(result), // 不运行 error => alert(error) // 1 秒后显示 "Error: Whoops!" ); -
如何使用 Promise.all
Promise.all 可以用于并行执行多个promise, 并等待所有promise都准备就绪。
语法:
let promise = Promise.all([...promises...]);Promise.all接受一个 promise 数组作为参数并返回一个新的 promise。当所有给定的 promise 都 resolve 时,新的 promise 才会 resolve,并且其结果数组将成为新 promise 的结果。
例如,下面的
Promise.all在 3 秒之后 settled,然后它的结果就是一个[1, 2, 3]数组。
Promise.all([
new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
new Promise(resolve => setTimeout(() => resolve(3), 1000)) // 3
]).then(alert);
// 1,2,3 当上面这些 promise 准备好时:每个 promise 都贡献了数组中的一个元素
- 如何使用 Promise.race
与 Promise.all 类似,但只等待第一个 settled 的 promise 并获取其结果(或 error)。
语法:
let promise = Promise.race(iterable);
这里第一个 promise 最快,所以它变成了结果。第一个 settled 的 promise “赢得了比赛”之后,所有进一步的 result/error 都会被忽略。