【原创】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)
    })
    
});

 

posted @ 2022-08-11 12:16  小匡程序员  阅读(32)  评论(0编辑  收藏  举报