嵌套 promise

//pro1 中return一个Promise对象
function pro1(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{console.log(1000);resolve();},1000);
        
    })
}

//pro2 中return一个Promise对象
function pro2(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{console.log(5000);resolve();},5000);
        
    });
}

//pro3 中return一个Promise对象
function pro3(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{console.log(500);resolve();},500);
    })
}


pro1().then(pro2).then(pro3).then(()=>{console.log('ok')});  //这种执行方式总感觉有问题
 

 

  应该用一下方式才对

        //pro1 中return一个Promise对象
        function pro1() {
            return new Promise((resolve, reject) => {
                setTimeout(() => { console.log('---pro1---'); resolve('data1'); }, 300);
            })
        }

        //pro2 中return一个Promise对象
        function pro2() {
            return new Promise((resolve, reject) => {
                setTimeout(() => { console.log('---pro2---'); resolve('data2'); }, 200);
            });
        }

        //pro3 中return一个Promise对象
        function pro3() {
            return new Promise((resolve, reject) => {
                setTimeout(() => { console.log('---pro3---'); resolve('data3'); }, 100);
            })
        }


        // pro1().then(pro2()).then(pro3()).then(() => { console.log('ok') }); 
        //结果:
        // ---pro3---
        // ---pro2---
        // ---pro1---
        // ok

        //应该用这种执行方式
        pro1().then(data => {
            console.log('1:',data);
            pro2().then(data => {
                console.log('2:', data);
                pro3().then(data => { console.log('3:', data) });
            })
        })

 

 

http://liubin.org/promises-book  这里说的很详细  有空看看

 

 

另外一种形式

        let p2 = new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log('---p2---');
                    resolve('p2 return data');
                }, 300);
        });

        //pro1 中return一个Promise对象
        function pro1() {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log('---pro1---');
                    resolve(p2);  //返回p2的return
                }, 100);
            })
        }
 

        pro1().then(            
            data => {  // data = p2的返回            
            console.log(data);
        })
  

----------------

方法链:

        function taskA() {
            console.log("Task A");
            throw new Error("throw Error @ Task A")
        }
        function taskB() {
            console.log("Task B");// 不会被调用
        }
        function onRejected(error) {
            console.log(error);// => "throw Error @ Task A"
        }
        function finalTask() {
            console.log("Final Task");
        }

        var promise = Promise.resolve();
        promise
            .then(taskA)
            .then(taskB)   //如果taskA不出异常,则执行这行, 出异常执行下一行
            .catch(onRejected)
            .then(finalTask);

//结果:
Task A
Error: throw Error @ Task A
Final Task

前面例子中的Task都是相互独立的,只是被简单调用而已。

这时候如果 Task A 想给 Task B 传递一个参数该怎么办呢?

答案非常简单,那就是在 Task A 中 return 的返回值,会在 Task B 执行时传给它。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值