技术标签: 研究过
先总结:参数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
简书:
文章浏览阅读1.4k次,点赞5次,收藏18次。B样条曲线曲面拟合(更新中...)_b-样条曲面拟合
文章浏览阅读284次,点赞4次,收藏2次。W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景存储介质:Nor Flash(闪存)时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)存储容量(24位地址):写入操作时:写入操作前,必须先进行写使能,一种保护措施,防止误操作。写使能,可以直接使用SPI,发送一个写使能的指令。每个数据位只能由1改写为0,不能由0改写为1,Flash并没有像RAM那样的直接完全覆盖读写的能力。_w25q64扇区起始地址
文章浏览阅读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
文章浏览阅读897次。【代码】头歌:第1关:学习-Java常用类之Pattern和Matcher类。_头歌第一关学习-java常用类之pattern和matcher类
文章浏览阅读1.6w次,点赞6次,收藏38次。SQL行转列汇总阅读目录一. 基础语法: 二. 典型实例一. 基础语法:PIVOT用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为 90 )SQL2008 中可以直接使用完整语法:._sql 行转列
文章浏览阅读369次。最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13): undefined reference to `func' 关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。1. 链接时缺失_in function `conf_parse_list': conf_mod.c:(.text+0xdc4): undefined reference
文章浏览阅读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编程
文章浏览阅读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函数
文章浏览阅读1.5k次,点赞4次,收藏11次。在eclipse开发环境下使用java语言来连接MySQL8.0数据库_java连接mysql8.0
文章浏览阅读67次。跨境电商测评公司,7年经验,擅长亚马逊、拼多多等平台。提供跨境电商平台养号环境软件开发,解决各平台矩阵养号防关联、砍单、F号问题。搭建自己的测评补单系统,帮助卖家提高权重和排名,降低运营成本。_补单系统的意义
文章浏览阅读902次。转自:http://blog.csdn.net/tkokof1/article/details/7426706 题记:这阵子一直在学习cocos2d-x,其跨平台的特性确实让人舒爽,引擎的框架概念也很成熟,虽然相应的第三方工具略显单薄,但也无愧是一件移动开发的利器啊,有兴趣的朋友有时间就多了解一下吧 :)使用引擎的过程中遇到的问题很多,中文支持便是一例,虽然问题_cocos2d-x 中文 支持ascii么
文章浏览阅读378次,点赞4次,收藏4次。当不需要调光时,需直接拉高电压至 VDD引脚,不能悬空。AP5170 典型应用图,当 MOS 开关管处于导通状态时、输入电压通过 LED 灯、电感、MOS开关管、电流检测电阻 Rcs 对电感充电,流过电感的电流随充电时间逐渐增大,当电流检测电阻 Rcs 上的电压降达到电流检测阈值电压 VCS_TH 时,控制电路使得内置的 MOS 开关管关断。AP5170 采用 ESOP8 封装,散热片内置接 SW 脚,通过调节外置电流检测的电阻值来设置流过 LED 灯的电流,支持外加电压线性调光,最大电流 1.5A。