直接入正题
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方法
待更。。