promise原理浅理解

昨天朋友问了我一段关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值