回调
一直是JavaScript编程中比较令人纠结的写法,主要场景是用于处理 “并列”或者“并行”的操作,然后在回调函数中处理操作结果。这样子原生的回调写法就会带来一下的不便。
例如下面的回调的写法
function func(num, callback) {setTimeout(() => {try {let result = 1/num;callback(result, null);} catch(err) {callback(null, err);}}, 10)}func(1, (result, err) => {if( err ) {console.log(err)} else {console.log(result)}})
上述代码中,发现如果要处理回调结果 result
和错误err
,后续的所有就必须在回调函数里面处理,而且回调函数里面还需要自己处理异常判断。 那如果是使用了Promise
来处理回调操作,就可以用以下写法处理。
function func(num, callback) {return new Promise((resolve) => {setTimeout(() => {let result = 1/num;resolve(result);}, 1000)})}func(1).then((result) => {console.log(result)}).catch((err) => {console.log(err)})
Promise 带来的能力是任务管理
,常用的方式有
new Promise(...).then(onResolved, onRejected)
resolve
成功状态,对应 Promise.resolve
reject
失败状态,对应 Promise.reject
error
异常状态, 对应 Promise.reject
或 new Promise().catch(onRejected)
Thenabled
机制提供任务方法链new Promise().then().then().catch()
处理任务的成功状态
let p = new Promise((resolve) => {setTimeout(() => {let result = 1;resolve(result);}, 1000)})p.then((result)=>{ console.log(result) })
let p = Promise.resolve(1)p.then((result)=>{ console.log(result) })
处理任务的失败状态
let p = new Promise((resolve, reject) => {setTimeout(() => {let result = 2;reject(result);}, 100)})// 有两种方式获取失败状态// 第一种,通过then 第二个函数参数处理失败状态p.then((result)=>{console.log('success:',result);}, (result)=>{console.log('fail:',result);})// "fail: 2"// 第二种,或者通过,catch 获取失败状态p.then((result)=>{console.log('success:',result);}).catch((result)=>{console.log('error:',result);})// "error: 2"// 注意:如果两种方式同时使用的话// 只会被第一种方式reject操作失败的结果p.then((result)=>{console.log('success:',result);}, (result)=>{console.log('fail:',result);}).catch((result)=>{console.log('error:',result);})// "fail: 2"
let p = Promise.reject(2)p.then(null, result => console.log('fail:', result))// 或p.then().catch( result => console.log('error:', result))
从上述 reject
的使用过程中,会发现, catch
操作在没有设置 onRejected 处理的时候,会被catch
捕获失败处理。同时catch
也会捕获 onResolved 和 onRejected中出现的错误。
reject
结果let p = new Promise((resolve, reject) => {reject(3)});p.then((result) => {console.log('success:', result)}).catch((result) => {console.log('error:', result)})// "error: 3"
let p = new Promise((resolve) => {resolve(3)});p.then((result) => {throw new Error('custom resolve error!')console.log('success:', result)}).catch((err) => {console.log('Custom error:', err)})// "Custom error: Error: custom resolve error!"
let p = new Promise((resolve) => {reject(3)});p.then(null, (result) => {throw new Error('custom reject error!')console.log('fail:', result)}).catch((err) => {console.log('Custom error:', err)})// "Custom error: Error: custom reject error!"
由于本书主要介绍 Koa.js
的原理,主要涉及到Promise
的resolve
、reject
和catch
更多 关于 Promise
的原理和使用,请查看一下文档:
https://docs.microsoft.com/zh-cn/scripting/javascript/reference/promise-object-javascript