Promise–API的使用(es6篇)
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
1,promise简单用法 注:一般用于异步加载
(1)Promise创建就会执行
(2)调用resolve(成功)或reject(失败)并不会终结 Promise 的参数函数的执行
const promise = new Promise(function (resolve, reject) {
console.log("Promise创建就会执行");
if (true) {
resolve(111);
console.log("调用resolve或reject并不会终结 Promise 的参数函数的执行") //这段打印还会执行
} else {
reject(222);
}
});
promise.then(function (res) {
console.log("成功返回" + res) //111
}, function (e) {
console.log("失败返回" + e); //条件为false 返回 222
});
2, promise.then() : then两种返回 第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数。
promise.catch() :监听rejected 与then第二个参数同理,不同点:如果then方法在运行中抛出错误,也会被catch方法捕获。 注:建议使用catch() 监听错误
promise.finally():不管成功失败都会执行
const promise = new Promise(function (resolve, reject) {
if (true) {
resolve(111);
} else {
reject(222);
}
});
//第一种格式
promise.then(function (res) {
console.log("成功返回" + res) //111
}, function (e) {
console.log("失败返回" + e);
});
//第二种格式 (推荐使用第二种)
promise.then(function (res) {
console.log("成功返回" + res) //111
}).catch(function (e) {
console.log("失败返回" + e);
}).finally(function () {
console.log("成功失败都会执行");
});
3, Promise.all():监听多个Promise返回 ,等所有Promise执行完毕才会返回
Promise.race() :监听多个Promise返回 ,那个Promise执行完毕的早就会返回那个(只返回一个Promise的值)
const promise1 = new Promise(function (resolve, reject) {
setTimeout(() => { //异步操作 相当于ajax 一快一慢
resolve(111);
}, 5000)
});
const promise2 = new Promise(function (resolve, reject) {
setTimeout(() => {
resolve(222);
}, 1000)
});
Promise.all([promise1,promise2]).then(function (res) {
console.log(res) //5s后执行返回[111,222] 等所有Promise执行完才会触发
}).catch(function (e) {
console.log(e) //如果有一个失败了就会触发catch 返回第一个失败的值
});
Promise.race([promise1,promise2]).then(function (res) {
console.log(res) //1s后执行返回 》222
}).catch(function (e) {
console.log(e) //同上
});
4, 注:个人感觉不常用
Promise.resolve() :将现有的对象转为Promise对象
Promise.reject() :将现有的对象转为Promise对象,但是该实例的状态为失败
实例一
let obj= {
then: function(resolve, reject) {
resolve(111);
}
};
let one = Promise.resolve(thenable);
one.then(function(value) {
console.log(value); // 111
});
实例二:如果参数是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的 Promise 对象
const p = Promise.resolve('222');
p.then(function (s){
console.log(s) //222
});
5,Promise.try() :让同步函数同步执行,异步函数异步执行
const f = () => console.log('one');
Promise.resolve().then(f); //转为Promise对象,同步执行就变成异步执行了
console.log('two'); //先执行
// two
// one
const f = () => console.log('one');
Promise.try(f); //同步执行
console.log('two');
// one
// two
本文参考于:http://es6.ruanyifeng.com/#docs/promise