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

吕大豹

 最近写了三篇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);
});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老九学堂

必看 | 新人必看的Java基础知识点大梳理

各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的“冰镇西瓜,”给大家清凉一下,压压惊。但这个大西瓜可不是一般的大西瓜,是...

38780
来自专栏前端知识分享

第205天:面向对象知识点总结

JSON全称为JavaScript对象简单表示法(JavaScript Object Notation)

10330
来自专栏阿凯的Excel

Python读书笔记5(字符串相关应用)

上期分享了Python相关的字符串应用,重点分享了转义字符。今天和大家分享和字符串相关的函数和应用。 一、字符串的合并! ? Python用“+”号可以连接...

38050
来自专栏Redis源码学习系列

Redis源码学习之整数集合

整数集合在Redis中是集合对象的底层存储之一,当一个集合对象的元素都是整数类型且元素数量不多(不超过512个)时,就会使用整数集合。

13700
来自专栏zaking's

用js来实现那些数据结构02(数组篇02-数组方法)

    上一篇文章简单的介绍了一下js的类型,以及数组的增删方法。这一篇文章,我们一起来看看数组还有哪些用法,以及在实际工作中我们可以用这些方法来做些什么。由于...

438110
来自专栏宏伦工作室

全栈 - 4 Python 先学会基本语法

27970
来自专栏Laoqi's Linux运维专列

数据类型转换

16250
来自专栏我是业余自学C/C++的

strlen()

17430
来自专栏Python小屋

Python版选择排序算法

关于Python版冒泡排序算法请参考:Python版冒泡法排序算法。 def selectSort(lst, reverse=False): leng...

30850
来自专栏Create Sun

python 3.x 爬虫基础---正则表达式(案例:爬取猫眼信息,写入txt,csv,下载图片)

  正则表达式是对字符串的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则的字符串”,此字符串用来表示对字符串的一种“过滤”逻辑。...

63140

扫码关注云+社区

领取腾讯云代金券