怎么理解new Promise(function (resolve, reject){})中函数的参数resolve和reject-程序员宅基地

技术标签: 研究过  

先总结:参数resolve和reject的作用是将Promise中函数要传递的值,作为参数传给后面的then和catch中函数。

resolve(值1)把值1传给promise,然后再由promise把值1传给then(function(值1));reject(值2)把值2给promise,然后再由promise把值2传给catch(function(值2))。

理解的过程:

开始学习廖雪峰的Promise文章时,看到:

function test(resolve, reject) {
    var timeOut = Math.random() * 2;
    log('set timeout to: ' + timeOut + ' seconds.');
    setTimeout(function () {
        if (timeOut < 1) {
            log('call resolve()...');
            resolve('200 OK');
        }
        else {
            log('call reject()...');
            reject('timeout in ' + timeOut + ' seconds.');
        }
    }, timeOut * 1000);
}

以为参数resolve, reject是用户设的俩函数,执行结果与Promise异步过程无关。

但看到后面:

// 0.5秒后返回input*input的计算结果:
function multiply(input) {
    return new Promise(function (resolve, reject) {
        log('calculating ' + input + ' x ' + input + '...');
        setTimeout(resolve, 500, input * input);
    });
}

// 0.5秒后返回input+input的计算结果:
function add(input) {
    return new Promise(function (resolve, reject) {
        log('calculating ' + input + ' + ' + input + '...');
        setTimeout(resolve, 500, input + input);
    });
}

var p = new Promise(function (resolve, reject) {
    log('start new Promise...');
    resolve(123);
});

p.then(multiply)
 .then(add)
 .then(multiply)
 .then(add)
 .then(function (result) {
    log('Got value: ' + result);
});

就发现不对,因为打印的123*123不是 multiply函数内的,只能来自函数唯一的参数,谁输入了这个参数呢,只能是promise。

 

回头仔细研究发现,resolve和reject可以改名,但需要保证名称一致,如将resolve都改为s:

var p1 = new Promise(function (s, reject) {

            s('200 OK');

            reject('timeout in ' + timeOut + ' seconds.');

})
log('p1 over: ');
var p2 = p1.then(function (r) {
    log('Done: ' + r);
},function (r) {
    log('Done: ' + r);
});
log('p2 over: ');

Log:

p1 over:

p2 over:

Done: 200 OK

而且先执行了resolve,then就生效,后执行的reject好像就没有效果了。

如果先执行reject后执行resolve,那么then不会生效。

var p1 = new Promise(function (s, reject) {
  reject('timeout in ' + 2+ ' seconds.');
  s('200 OK');

})
log('p1 over: ');
var p2 = p1.then(function (r) {
    log('Done: ' + r);
},function (r) {
    log('Done: ' + r);
});
log('p2 over: ');

Log:

p1 over:

p2 over:

Done: timeout in 2 seconds.

 

 

 

 

特别注意,如果函数内部没有执行resolve和reject,那么这个promise分支就不会继续执行。

 

var p1 = new Promise(function (s, reject) {
  log('timeout in ' + 2+ ' seconds.');
  log('200 OK');

})
log('p1 over: ');
var p2 = p1.then(function (r) {
    log('Done: ' + r);
},function (r) {
    log('Done: ' + r);
});
log('p2 over: ');

结果:

Log:

timeout in 2 seconds.

200 OK

p1 over:

p2 over:

 

 

 

注:本文使用第二种风格的catch:

 

1、第一种错误处理

    new Promise((resolve) => {
        setTimeout(() => {
            throw new Error('bye');
        }, 2000)
    }).then((value) => {
        console.log(value);
    }).catch(error => {
        console.log('Error', error);
    })

2、第二种错误处理

    // 第二种错误处理
    new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('bye');
        }, 2000)
    })
        .then((val) => {
            console.log(val)
        }, (err) => {
            console.log('Error:' + err);
        })

廖雪峰:
https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

简书:

https://www.jianshu.com/p/3190ad5965d7

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27361945/article/details/102964414

智能推荐

B样条曲线曲面拟合_b-样条曲面拟合-程序员宅基地

文章浏览阅读1.4k次,点赞5次,收藏18次。B样条曲线曲面拟合(更新中...)_b-样条曲面拟合

W25Q64_w25q64扇区起始地址-程序员宅基地

文章浏览阅读284次,点赞4次,收藏2次。W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景存储介质:Nor Flash(闪存)时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)存储容量(24位地址):写入操作时:写入操作前,必须先进行写使能,一种保护措施,防止误操作。写使能,可以直接使用SPI,发送一个写使能的指令。每个数据位只能由1改写为0,不能由0改写为1,Flash并没有像RAM那样的直接完全覆盖读写的能力。_w25q64扇区起始地址

linux下将Python环境默认更改为Python3.6_linux python 默认3.6-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏19次。由于在实际使用的时候由于默认的一些程序都是使用的python如果直接调用启动的是Linux自带的2.7的环境就会出现很多问题, 所以这里记录下环境更改为3.6的做法mv /usr/bin/python /usr/bin/python.bak #删除原来指向python2的软链接ln -s /usr/local/python3.6/bin/python3.6 /usr/bin/pytho..._linux python 默认3.6

头歌:第1关:学习-Java常用类之Pattern和Matcher类_头歌第一关学习-java常用类之pattern和matcher类-程序员宅基地

文章浏览阅读897次。【代码】头歌:第1关:学习-Java常用类之Pattern和Matcher类。_头歌第一关学习-java常用类之pattern和matcher类

死磕:SQL行转列汇总(全网最全最详细)_sql 行转列-程序员宅基地

文章浏览阅读1.6w次,点赞6次,收藏38次。SQL行转列汇总阅读目录一. 基础语法: 二. 典型实例一. 基础语法:PIVOT用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为 90 )SQL2008 中可以直接使用完整语法:._sql 行转列

undefined reference问题总结_in function `conf_parse_list': conf_mod.c:(.text+0-程序员宅基地

文章浏览阅读369次。最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13): undefined reference to `func' 关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。1. 链接时缺失_in function `conf_parse_list': conf_mod.c:(.text+0xdc4): undefined reference

随便推点

Java基础:IO编程_java io编程-程序员宅基地

文章浏览阅读402次。IO编程1、IO流脑图2、IO流分类3、File类操作文件4、访问文件字节流:FileInputStream & FileOutputStream/** * FileInputStreamTest * @throws IOException */ @Test public void test01() throws IOException { String path = "F:\\file2.txt"; _java io编程

To_Date函数用法-程序员宅基地

文章浏览阅读593次。spl> select * from emp where dates between to_date('2007-06-12 10:00:00', 'yyyy-mm-dd hh24:mi:ss') and to_date('2007-06-12 10:00:00', 'yyyy-mm-dd hh2..._to_datetime函数

JDBC001--java中的jdbc数据库的初步连接(MySQL8.0)_java连接mysql8.0-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏11次。在eclipse开发环境下使用java语言来连接MySQL8.0数据库_java连接mysql8.0

跨境电商卖家搭建自己的测评(补单)系统有什么好处?_补单系统的意义-程序员宅基地

文章浏览阅读67次。跨境电商测评公司,7年经验,擅长亚马逊、拼多多等平台。提供跨境电商平台养号环境软件开发,解决各平台矩阵养号防关联、砍单、F号问题。搭建自己的测评补单系统,帮助卖家提高权重和排名,降低运营成本。_补单系统的意义

cocos2d-x 中文支持问题_cocos2d-x 中文 支持ascii么-程序员宅基地

文章浏览阅读902次。转自:http://blog.csdn.net/tkokof1/article/details/7426706 题记:这阵子一直在学习cocos2d-x,其跨平台的特性确实让人舒爽,引擎的框架概念也很成熟,虽然相应的第三方工具略显单薄,但也无愧是一件移动开发的利器啊,有兴趣的朋友有时间就多了解一下吧 :)使用引擎的过程中遇到的问题很多,中文支持便是一例,虽然问题_cocos2d-x 中文 支持ascii么

电动车摩托车灯DC-DC降压恒流芯片AP5170支持线性调光95%高效率IC-程序员宅基地

文章浏览阅读378次,点赞4次,收藏4次。当不需要调光时,需直接拉高电压至 VDD引脚,不能悬空。AP5170 典型应用图,当 MOS 开关管处于导通状态时、输入电压通过 LED 灯、电感、MOS开关管、电流检测电阻 Rcs 对电感充电,流过电感的电流随充电时间逐渐增大,当电流检测电阻 Rcs 上的电压降达到电流检测阈值电压 VCS_TH 时,控制电路使得内置的 MOS 开关管关断。AP5170 采用 ESOP8 封装,散热片内置接 SW 脚,通过调节外置电流检测的电阻值来设置流过 LED 灯的电流,支持外加电压线性调光,最大电流 1.5A。