最近写了三篇Promise的文章。拿来一学,自己画了好些笔记,分享一下。
简述一下es6中的要点:
1、Promise是一个构造函数,自己身上有all、reject、resolve、then、catch。。。。。
Promise定义时,必须传递一个函数,否则报错;
该函数有两个参数,这个参数也是函数,这两个函数应该是内部生成并传递进去的。
var p = new Promise(function(resolve, reject){ //做一些异步操作
setTimeout(function(){
resolve('随便什么数据');
}, 2000);
});
定义后,这个Promise会直接执行的。 这是我原来没有意识到的。
2、p.then(resolvedFun,rejectedFun);
then方法也是返回一个新的Promise,并不再是原来的Promise自己了。 以第一个函数resolvedFun为例来说明,
resolvedFun=function(data){
//return "完成 "+data; 直接返回数据,也会被封装出一个新的Promise实例来,以提供给下then调用。
//return new Promise(function(){}); 返回另一个Promise 。 我测试这个new Promise是否和then返回后的Promise不是同一个。
}
测试代码:
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
console.log('执行完成');
resolve( "somedata");
}, 2000);
})
thenP=p.then(function(data){
window.newP= new Promise(function(){});
return window.newP
})
thenP===newP //显示是false,表明内部会对then的参数函数的返回值进行包装。
3、p.catch(catchFun);
文中提到,catchFun相当于代替then中的第二个参数:rejectedFun。这一点没问题
但还说“如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中”
经过我在chrome,node,edge里面测试结果,这个说法是不对的。如果代码写错,比如变量未定义这种,是会报错,而不是进入到catch中,看来还是要try catch来捕获代码的异常。
----2016.12.14更正一下:catch只捕获then中的异常,且cache的参数函数被传入的reason是一个Error对象。
不知道我原来是怎么测试的,我当时可能是在Promise的构造函数中写的异常,就以为原作者写的不对!
4、Promise.all([ 多个Promise对象 ]).then(function( resultList){});
这个记住结构就好了。
5、Promise.race([ 多个Promise对象 ]).then(function( firstResult){});
只返回第1个异步回来的结果。这个原来没注意到过。
2016.12.6 补充:
一般情况下我们会使用 new Promise
来创建prmise对象,除此之外我们也可以使用 Promise.reslove
和 Promise.reject
来直接创建,例如 Promise.resolve(42)
可以认为是以下代码的语法糖
new Promise((reslove)=>{
reslove(42);
});