【原创】Promise异步编程
show me the code
function getPromise(cbk){ return (new Promise(cbk)); } getPromise(function (res,rej) { res("suc1") //只会执行一个,并把参数传递到catch或者then rej("err1") }).catch(function(err){ console.log(err,1) }).then(function (res) { console.log(res,2) getPromise(function(res,rej){ /*res((new Promise(function(res,rej){ //return "suc2"; res("suc2") })))*/ //res() 不能传递Promise对象 //res("suc2") rej((new Promise(function(res,rej){ rej("err2") //then不会执行 }))) //不能在res()之后执行 }).catch(function (err) { console.log(err,3) err.catch(function(err){ console.log(err,3.2) }).then(function(res){ console.log(res,3.3) }) }).then(function (res) { console.log(res,4.1) }) return "succ2-1" }).then(function(res){ console.log(res,5) return getPromise(function(res,rej){ rej("err3") res("suc3") }) .catch(function (err) { console.log(err,6) return "err3-1" }) .then(function (res) { console.log(res,7) return res }) }).catch(function(err){ console.log(err,8) }).then(function(res){ console.log(res,9) return getPromise(function(res,rej){ rej("err4") res("suc4") }) }).catch(function(err){ console.log(err,10) return "from catch" }).then(function(res){ console.log(res,11) //会报错 /*res.catch(function(err){ console.log(res,10) }).then(function(res){ console.log(res,11) })*/ getPromise(function(res,rej){ //return "end" //会退出 //rej("err5") rej((new Promise(function(res,rej){ res("suc5-1") //then不会执行 }))) res("suc6") return "end2" //返回值无用 }).catch(function(err){ console.log(err,12.1) err.catch(function(err){ console.log(err,12.2) }).then(function(res){ console.log(res,12.3) }) return "suc6 from catch" }).then(function(res){ //res()和rej()有一个执行都会走then() console.log(res,13) //return "suc7" return (new Promise(function(res,rej){ //res("suc7-1") //then不会执行 })) }).then(function(resp){ console.log(resp,14) }) }); 结果 suc1 2 Promise { <rejected> 'err2' } 3 succ2-1 5 err2 3.2 undefined 4.1 err3 6 undefined 3.3 err3-1 7 err3-1 9 err4 10 from catch 11 Promise { 'suc5-1' } 12.1 suc6 from catch 13 suc5-1 12.3
结论:
1,resolve()和reject()有一个执行都会走 then();
2,Promise的cbk()内部 return 返回值,只会退出但返回值没有用;
3,then()和catch()方法只会接收resolve()和reject()的传递过来的值;
4,then()方法若有返回值,会传给下一个then()方法的参数,即最简单的链式调用;
5,resolve()和reject()顺序:reject()先执行时,catch()和then()都会触发,但是then()接收的参数为null,此时如果在catch()方法中有return 返回值,则可以被then()接收到;resolve()先执行时,只会触发then(),参数传递有效;
6,reject()可以传递Promise对象但不能在resolve()之后执行会报错,resolve()不可以传递Promise对象会报错;
7,then()和catch()返回不了Promise对象;catch()可以接收Promise对象;
一定要加上异步任务,否则没有啥意义:
function getPromise(cbk){ return (new Promise(cbk)); } getPromise(function (res,rej) { setTimeout(function () { console.log("time1") res("suc1") //只会执行一个,并把参数传递到catch或者then rej("err1") },500) }).catch(function(err){ console.log(err,1) }).then(function (res) { console.log(res,2) getPromise(function(res,rej){ /*res((new Promise(function(res,rej){ //return "suc2"; res("suc2") })))*/ //res() 不能传递Promise对象 //res("suc2") setTimeout(function () { rej((new Promise(function(res,rej){ rej("err2") //then不会执行 }))) //不能在res()之后执行 },500) }).catch(function (err) { console.log(err,3) err.catch(function(err){ console.log(err,3.2) }).then(function(res){ console.log(res,3.3) }) }).then(function (res) { console.log(res,4.1) }) return "succ2-1" }).then(function(res){ console.log(res,5) return getPromise(function(res,rej){ setTimeout(function () { rej("err3") res("suc3") },500) }) .catch(function (err) { console.log(err,6) return "err3-1" }) .then(function (res) { console.log(res,7) return res }) }).catch(function(err){ console.log(err,8) }).then(function(res){ console.log(res,9) return getPromise(function(res,rej){ setTimeout(function () { rej("err4") res("suc4") },500) }) }).catch(function(err){ console.log(err,10) return "from catch" }).then(function(res){ console.log(res,11) //会报错 /*res.catch(function(err){ console.log(res,10) }).then(function(res){ console.log(res,11) })*/ getPromise(function(res,rej){ setTimeout(function () { rej((new Promise(function(res,rej){ res("suc5-1") //then不会执行 }))) res("suc6") },500) return "end2" //返回值无用 }).catch(function(err){ console.log(err,12.1) err.catch(function(err){ console.log(err,12.2) }).then(function(res){ console.log(res,12.3) }) return "suc6 from catch" }).then(function(res){ //res()和rej()有一个执行都会走then() console.log(res,13) //return "suc7" return (new Promise(function(res,rej){ //res("suc7-1") //then不会执行 })) }).then(function(resp){ console.log(resp,14) }) });