Promise的深入理解

一、promise 的认识

1.js的单线程

1)javascript的执行环境是单线程的
2)单线程:指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任务,这个任务可称为主线程,但是实际上还有其他线程,如事件触发线程、ajax请求线程等

2.同步与异步

1)同步模式:也就是单线程模式,一次只能执行一个任务,函数调用后需等到函数执行结束,返回执行的结果,才能进行下一个任务,如果这个任务执行的时间较长,就会导致线程阻塞
2)异步模式:可以一起执行多个任务,函数调用后不会立即返回执行的结果,如果任务A需要等待,可先执行任务B,等到任务A结果返回后再继续回调

3.回调函数

1)回调函数:一段可执行的代码段,它以参数的形式传递给其他代码,在其合适的时间执行这段回调函数的代码,可以理解为执行完回来调用的函数
2)回调函数可以运用在同步调用,回调函数一般是最后执行的
实例代码:

   // 同步回调,回调函数一般是最后执行的
   //  before    3S后出现  callback  after
   // 将f2函数作为参数传入f1中,先执行输出before,判断f2是否是回调函数,再判断是否决定执行
   // f2是回调函数,3s后执行,输出callback,然后输出after
   var f1 = function(callback){

       console.log("before");
       (callback && typeof(callback) === "function") && callback();
       console.log("after");
   };

   var f2 = function(callback){

       var start = new  Date();
       while((new Date()-start)<3000){}
       console.log("callback");
   };
   f1(f2);

3)回调函数可以运行在异步调用,回调函数可能一段时间后执行或不执行,未达到执行的条件
实例代码:

    // 异步调用,可能一段时间后执行或不执行
    // 常见的异步回调有setTimeout()、setInterval(),还有ajax请求

    function request(url,parm,successFun,errorFun){
        $.ajax({
            type:'GET',
            url:url,
            parm:parm,
            async:true,
            success:successFun,
            error:errorFun
        });
    }

    request("test03.html","",function(data){
        // 请求成功,对请求回来的数据进行处理
       console.log("请求成功后回调",data);
    },function(error){
        // 请求失败,返回请求失败的信息
        console.log("请求失败了",error);
    });

4.promise的写法
1)Promise对象代表一个未完成、但预计将来会完成的操作 ,是一种异步的解决方案
它的三种状态为:
pending:初始值,不是fulfilled,也不是rejected
fulfilled:代表操作成功,解决
rejected:代表操作失败,拒绝
2)Promise有两种状态改变的方式,既可以从pending转变为fulfilled,也可以从pending转变为rejected。一旦状态改变,就「凝固」了,会一直保持这个状态,不会再发生变化。当状态发生变化,promise.then绑定的函数就会被调用
注意:Promise一旦新建就会立即执行,无法取消
3)实例如下:

     // promise是一个回调函数
    // resolve  异步操作执行成功后的回调函数,将Promise的状态置为fullfiled
    // reject  异步操作执行失败后的回调函数,将Promise的状态置为rejected
    var p = new Promise(function(resolve,reject){
        //  2s后输出     执行完成
        setTimeout(function(){
            console.log("执行完成");
            resolve("操作成功");
            reject("操作失败");
        },3000);
    });

4)优化,实际上Promise上的实例_promise是一个对象,不是一个函数,在声明的时候Promise传递的参数函数会立即执行。所以promise一般是包在一个函数中,在它的外层裹上一层函数,在需要的时候去运行这个函数
实例如下:

     // 创建了promise对象,在runAsync()函数中return返回promise对象
    //   2s后输出  执行完成
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值