Promise 的用途
- Promise是异步编程的一种解决方案,所谓
Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise
是一个对象,从它可以获取异步操作的消息。Promise
提供统一的 API,各种异步操作都可以用同样的方法进行处理。
Promise 的优点
- 规范了命名,使命名不在五花八门,
- 使代码易懂可读,不会出现回调地狱
- 更加方便的捕获错误
如何创建一个 new Promise
const promise = new Promise(function(resolve, reject) {
// 成功就调用resolve,失败就调用reject
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
如何使用 Promise.prototype.then(可查 MDN)
- then(第一个参数,第二个参数) 方法返回一个 Promise,他接受两个参数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数
- 成功 resolved 的 promise 做出的反应
let promise = new Promise(function(resolve, reject) { setTimeout(() => resolve("done!"), 1000); }); // resolve 运行 .then 中的第一个函数 promise.then( result => alert(result), // 1 秒后显示 "done!" error => alert(error) // 不运行 );
第一个函数被运行了。
- 失败 reject 的 promise 做出的反应
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(iterable) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个失败 promise 的结果。
const a1 = Promise.resolve(1),
const a2 = Promise.resolve(2),
const a3 = Promise.resolve(3);
Promise.all([a1, a2, a3]).then(function (results) {
console.log(results); // 返回[1, 2, 3]
});
在上述代码中:promise数组中所有的promise实例都变为resolve的时候,该方法才会返回,并将所有结果传递results数组中
const a1 = Promise.reject(3);
const a2 = 42;
const a3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([a1, a2, a3]).then((values) => {
console.log(values);
});
在上述代码中:promise数组中有一个实例是是reject的时候,此实例回调失败
如何使用 Promise.race
- Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
let promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 200, '100');
})
let promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, '200');
})
let promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 200, '300');
});
Promise.race = function (promises) {
return new Promise(((resolve, reject) => {
for (let i = 0; i < promises.length; i++) {
Promise.resolve(promises[i]).then((data) => {
resolve(data);
return;
}, err=>reject(err));
}
}
));
上述代码中:哪个promise先被处理完,就返回哪个的结果,可以是reject也可以是resolve