美文网首页
Promise的小总结

Promise的小总结

作者: 蜗牛Coming | 来源:发表于2019-10-22 18:28 被阅读0次

什么是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

相关文章

  • Promise的小总结

    什么是Promise? promise就是es6统一为了解决异步回调而提出的新的特性,它的好处在于异步执行的流程中...

  • Promise和Observable的区别

    refer: promise-vs-observable先上总结: Promise A Promise hand...

  • Promise

    前段时间公司小程序项目使用了Promise来解决异步调用的问题,今天简单总结一下 1.Promise 的用法 Pr...

  • 前端JS进阶三(ES6-Promise语法)

    Callback Hell Promise语法 总结 new Promise实例,而且要return new Pr...

  • .wpy文件点按钮分享时数据从后台获取如何去做

    总结: 主要考虑用await、async来处理 ![对小程序提供的api全都进行了promise处理]( )

  • 思维导图整理6种JS异步编程演变

    记录总结Promise对象 记录总结Generator函数和async函数

  • Promise总结

    前言 看完阮一峰大神的Promise详解之后,自己总结一下promise的用法,毕竟看的东西是别人的,自己写的总结...

  • promise 总结

    promise 总结 状态变换 pending -> fulfilled (success) pending ->...

  • AJAX(四)

    利用Promise将之前查身份证的小栗子重新修改下. 代码部分 总结 重构之后,handleSubmit看上去更加...

  • Promise总结

    手写Promise[https://segmentfault.com/a/1190000020505870] Pr...

网友评论

      本文标题:Promise的小总结

      本文链接:https://www.haomeiwen.com/subject/zizqvctx.html