Promise的小总结

2019-10-22  本文已影响0人  蜗牛Coming

什么是Promise?

promise就是es6统一为了解决异步回调而提出的新的特性,它的好处在于异步执行的流程中,把执行代码和处理结果的代码分离了。多个异步操作可以链式调用,避免了回调函数的层层嵌套。

Promise 怎么使用?

         //一段伪代码
        var p = new Promise(function(resolve,reject){
            // 一段异步操作的代码
            // resolve('success')  成功
            // reject('error')   失败
        });
        p.then(function(result){
            console.log(result);  //success
        },function(err){
            console.log(err); // error
        })
        //或者
        p.then(function(result){
            console.log(result);  //success
        }).catch(function(err){
            console.log(err)   //error
        })

Promise的小tips

1.Promise 本身是同步的,then是异步的:

console.log(1)  
var p = new Promise(function(resolve,reject){
    console.log(2);
    setTimeout(resolve,1000,3)
});
p.then(function(res){
    console.log(res);
})
console.log(4)
// 依次打印1 2 4 3(3是隔一秒之后打印)

2.promise 有三种状态 pending(未完成,初始状态)、fulfilled(完成,操作成功)、rejected(拒绝,操作失败)
promise状态只会从pending变成fulfilled 和从pending 变成rejected
而且状态一旦改变,就不会再变。

const promise = new Promise((resolve, reject) => {
    resolve('success1');
    reject('error');
    resolve('success2');
});
promise.then((res) => {
    console.log('then:', res);
}).catch((err) => {
    console.log('catch:', err);
})
//打印 then success1 
//状态已经被resolve,并且只能被resolve一次,所以后面的reject,resolve都不会起作用

3.promise带catch 链式操作

new Promise((resolve, reject) => {
    console.log('初始化');
    resolve();
})
.then(() => {
    throw new Error('有哪里不对了');
    console.log('执行「这个」”');
})
.catch(() => {
    console.log('执行「那个」');
})
.then(() => {
    console.log('执行「这个」,无论前面发生了什么');
});
//打印结果:
// 初始化
//  执行那个
// 执行「这个」,无论前面发生了什么
//-------------------------------------------分割线----------------------------------
//而如果catch写在最后
new Promise((resolve, reject) => {
    console.log('初始化');
    resolve();
})
.then(() => {
    throw new Error('有哪里不对了');
    console.log('执行「这个」”');
})
.then(() => {
    console.log('执行「这个」,无论前面发生了什么');
})
.catch(() => {
    console.log('执行「那个」');
})
//打印结果:
// 初始化
// 执行那个
如果只在最后catch错误,那么一遇到异常抛出,Promise 链就会停下来,直接调用链式中的 catch 处理程序来继续当前执行

4.Promise.resolve()和 Promise.reject() 是手动创建一个已经 resolve 或者 reject 的 Promise 快捷方法。
5.Promise.all() 用于将多个promise实例,包装成一个promise实例。接收一个数组参数,如果数组中所有的promise都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。

var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});
//打印结果  [3,42,'foo']

6.Promise.race() 接收一个数组参数,一旦参数中的某个promise resolve或者reject ,返回的promise就会resolve或者reject

var promise1 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 500, 'one');
});

var promise2 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then(function(value) {
  console.log(value);
});
//打印结果: two

7.一个优秀的写法:

[func1, func2, func3].reduce((p, f) => p.then(f), Promise.resolve())
.then(result3 => { /* use result3 */ });

8.一个面试题 update--2020-09-10

    setTimeout(function(){
        console.log(1);
    })

    new Promise(function(resolve,reject){
        console.log(2);
        resolve(3);
        reject('error');
        console.log(4);
    }).then(function(val){
        console.log(val);
    }).catch((err)=>{
        console.log(err);
    })

    console.log(5);
    // 2 4 5 3 1
    //考察点两点:
    //1) 无论是resolve还是reject,先触发一个之后就不会再触发另一个
    //2) resolve 后面代码还是会继续执行的,并且是同步执行的。

参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_promises
https://blog.csdn.net/weixin_34090562/article/details/88672431 (promise相关的面试题)
https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

上一篇下一篇

猜你喜欢

热点阅读