ES6 ---- Promise对象学习篇

直接入正题


Promise

promise是异步编程的一种解决方案。从语法上来分析,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

 有以下几个特点:

  • 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending进行中,fulfilled已成功, rejected已失败。
  • 一旦状态改变,就不会再变。只有两种成功或失败的状态,一旦发生就不会再改变了。会一直保持这个结果,这时就成为resolved已定型。
  • 和事件不同的是,事件你一旦错过,就无法再去得到结果。

const p = new Promise(function(resolve, reject){

if(  /*异步成功 */){

resolve(value);

}else{

reject(error);

}

})

Promise构造函数接受一个函数作为参数,该函数的两个参数是resolve和reject,这两个函数是由js引擎提供。

resolve函数的作用是,将promise对象的状态从pending=>resolve, 在异步操作成功时调用,并将异步操作的结果,作为参数传递。reject的作用是pending=>rejected,在异步操作失败时,将错误信息作为参数传递。

Promise实例生成之后,可以用then方法分别制定resolved和rejected状态的回调函数。

 Promise新建以后,会立即执行,如果操作成功,那么会走then方法,但是then方法指定的回调函数,将在当前脚本所有同步任务执行完以后才会执行

Promise.resolve()

 如想要将现有的对象转为Promise对象,则可以使用Promise.resolve();

const myPromise = Promise.resolve($.ajax('/whatever.json'));

需要注意的是:立即resolve()的Promise对象,是在本轮事件循环的结束时执行。

加载图片

我们可以将图片的加载写成一个Promise,一旦加载完成,Promise的状态就会发生变化。

const preloadImage = function (path){

return new Promise(function(resolve, reject){

      const image = new Image();

     image.onload = resolve;

     image.onerror = reject;

    image.src = path;

});

};

Promise.try()

Promise.resolve().then(f)  //如果f是同步函数,那么它会在本轮事件循环的末尾执行

const f = () =>console.log('a');
Promise.resolve().then()(f);
console.log('next');
//next
//a

 函数f本来是同步函数,被包装以后,变成了异步执行。

为了解决这个,想要让同步的函数同步执行,异步的函数异步执行,使用async函数来写;

const f = () => console.log('now');
(async()=>f())();
console.log('next');
//now
//next

执行async函数,如果f是同步的,则得到同步的结果,如果函数是异步,就可以用then指定下一步。

但是,async()=>f(); 会吃掉f()抛出的错误,如果想要捕获错误,要使用promise.catch方法


待更。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值