昨天朋友问了我一段关于promise的使用方法,自己看了一下感觉不是很清楚,然后就去摸索了一下.(先说一下自己对promise的浅理解,有错误的话欢迎指出)。
我理解的promise是一个含有某些特定方法的一个对象,直接new promise之后就自行调用,不需要外部在调用(那有时候想有需要的时候再执行promise呢,这也是最常用的方法就是将promise装在一个函数里面,什么时候想要执行promise的时候再调用该方法即可),附上小代码:
// 直接new一个promise对象 直接执行 不需要再外部调用
var promise = new Promise(function(resolve, reject) {
// 异步操作
setTimeout(function() {
console.log('执行完成');
// resolve(2);
}, 2000);
});
// 将promise写在函数里
// 将promise包裹在一个函数里面 需要promise的时候得去调用该函数
function runAsync() {
var p = new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('over');
reject(3);
}, 4000);
});
return p;
}
runAsync(); // 返回promise对象 不要忘了调用该方法
promise其实就是用来处理异步操作的,通过不同的状态来执行不同的回调函数,其接收两个回调函数,一个是resolve,另一个是reject。promise原生可使用的两个方法:then和catch.当promise里执行为resolve的时候调用的then方法,反之如果是rejected状态的话调用catch方法,promise还有一大特点在于当是fullfiled状态执行then函数里,若then函数里面的代码出现了问题,他不会代码报错,而是转而执行catch方法,(catch方法在这里有点类似于try…catch用于捕捉异常,现附上一小段创建promise最简单的代码:
let promise = new Promise((resolve, reject) => {
let data = [1, 2, 3, 4, 5];
// 判断promise的状态
if (data.length > 0) {
console.log('状态为resolve,打印111');
resolve();
} else {
console.log('状态为reject,打印end');
reject();
}
}).then(() => {
console.log(111); // resolve将promise置为fullfiled状态 则进入then
}).catch(() => {
console.log("end"); // reject将promise置为rejected状态 则进入catch 也有捕捉异常的功能(若then里代码出错也会进入catch)
}).finally(() => {
console.log(999); // 无论状态为reject还是fullfiled 都会执行(后执行);
})
在promise的回调函数里面不仅可以打印数据,也可以返回一个promise对象,这就涉及到promise的连调用。也就是说一个promise里面返回的promise对象仍然可以调用then方法和catch方法。
function runAsync() {
var p = new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('over');
reject(3);
}, 4000);
});
return p;
}
runAsync(); // 返回promise对象 不要忘了调用该方法
// promise的链式调用
runAsync().then(resolve => {
console.log(resolve);
return runAsync1(); //返回promise对象 类似runAsync
}).then(res => { // 调用返回的promise对象的then方法
console.log(res);
return runAsync2(); // 类似于runAsync函数
}).then(r => {
console.log(r);
});
promise除了then和catch方法之外还有all,race方法
// promise.all方法可以并行执行多个函数 三个函数全部执行完才会进入then里面
Promise.all([runAsync(), runAsync1(), runAsync2()]).then(function(results) {
console.log(results);
})
// promise.race方法与all方法唯一不同在于三个函数只要有一个执行完毕就会进入then
分享大佬文章,真的写的很清晰很好,超级适合我这种小菜鸡:
https://www.cnblogs.com/lvdabao/p/es6-promise-1.html