大白话讲解Promise(一)一文 的学习+新领悟

学习地址:http://www.cnblogs.com/lvdabao/p/es6-promise-1.htmlhtml

返回主页

吕大豹

 最近写了三篇Promise的文章。拿来一学,本身画了好些笔记,分享一下。node

 

简述一下es6中的要点:jquery

一、Promise是一个构造函数,本身身上有all、reject、resolve、then、catch。。。。。es6

Promise定义时,必须传递一个函数,不然报错; chrome

 该函数有两个参数,这个参数也是函数,这两个函数应该是内部生成并传递进去的。promise

 

var p = new Promise(function(resolve, reject){    //作一些异步操做
    setTimeout(function(){
        resolve('随便什么数据');
    }, 2000);
});

定义后,这个Promise会直接执行的。 这是我原来没有意识到的异步

二、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的参数函数的返回值进行包装。

三、p.catch(catchFun);

文中提到,catchFun至关于代替then中的第二个参数:rejectedFun。这一点没问题

但还说若是抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中”

通过我在chrome,node,edge里面测试结果,这个说法是不对的。若是代码写错,好比变量未定义这种,是会报错,而不是进入到catch中,看来仍是要try catch来捕获代码的异常。

----2016.12.14更正一下:catch只捕获then中的异常,且cache的参数函数被传入的reason是一个Error对象。  

不知道我原来是怎么测试的,我当时多是在Promise的构造函数中写的异常,就觉得原做者写的不对!

四、Promise.all([ 多个Promise对象 ]).then(function( resultList){}); 

这个记住结构就行了。

五、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);
});
相关文章
相关标签/搜索