Promise理解
纯粹为个人理解,有误请指正
什么是异步
查询数据从数据库,PHP第一个任务查询数据,后面有了新任务,那么后面任务会被挂起排队,而nodeJS是第一个任务挂起交给数据库去跑,然后去接待第二个任务交给对应的系统组件去处理挂起,接着去接待第三个任务···
示例:
new Promise((res, rej) => {
setTimeout(() => {
res('1')
}, 2000);
}).then(val => {
console.log(val);
}).catch(err => {
console.log(err);
})
console.log('2');
//输出:
//2
//1
promise是什么?
- 主要用于异步计算
- 作为一个对象,可以保存状态
new Promise(
function (resolve, reject) {
// 一段耗时的异步操作
resolve('成功') // 数据处理完成
// reject('失败') // 数据处理出错
}
).then(
(res) => {
console.log(res)}, // 成功
(err) => {
console.log(err)} // 失败
)
resolve、reject的作用
主要用于改变promise的状态,通过分支,运行到哪个改变成对应的状态
- resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 fulfilled),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。
- reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
promise的状态——不可逆
- pending [待定]初始状态
- fulfilled [实现]操作成功
- rejected [被否决]操作失败
一旦状态发生改变,就会触发then()里面的响应函数处理后续步骤。
错误捕捉:
方式一:
示例代码:
new Promise((res, rej) => {
setTimeout(() => {
res('正确')
}, 2000);
rej('错误')
}).then(val => {
console.log(val);
}, err => {
console.log(err);
})
方式二:
示例代码:
new Promise((res, rej) => {
setTimeout(() => {
res('正确')
}, 2000);
rej('错误')
}).then(val => {
console.log(val);
}).catch(err => {
console.log(err);
})
promise进入rejected状态,会直接进入catch()
用法:
-
常见用法:
异步操作和定时器放在一起,,如果定时器先触发,就认为超时,告知用户;
例如我们要从远程的服务家在资源如果5000ms还没有加载过来我们就告知用户加载失败 -
现实中常用:
回调包装成Promise,他有两个显而易见的好处:
1、可读性好
2、返回 的结果可以加入任何Promise队列
参考:https://www.jianshu.com/p/1b63a13c2701