es6 promise和async使用问题

promise实现2次请求,第三步是展示结果。第二次请求,可以拿到第一次请求的结果,但是到了第三步的res不是第二次请求返回的res,该怎么来写。

let a=new Promise((res,rej)=>{
                //第一次请求
                setTimeout(()=>{
                    res('data')
                })
            })
            a.then((res)=>{
            //第二请求
                setTimeout(()=>{
                    console.log('第二');
                },3000)
            }).then((res)=>{
            //第三步
                console.log(res+'第三');
            })

如果这个功能改成用asyncawait来写,

function a() {
                return new Promise((res, rej) => {
                    setTimeout(() => {
                        console.log('1');
                        res(1)
                    }, 2000)
                })
            }
            function c() {
                return new Promise((res) => {
                    setTimeout(() => {
                        console.log('2');
                        res(2)
                    }, 3000)
                })
            }
            async function b() {
                await a()
                await c()
            }
            let d=b()

c本来是在a中执行,当a执行之后,拿到a传来的参数进行请求或其他操作。现在也成这样类似同步的模式,c改如何拿到原本是a传过来的参数。

阅读 1.6k
2 个回答

第一种在原有代码的基础上修改,可以自行提取p2方法出来

let a = new Promise((res,rej)=>{
    //第一次请求
    setTimeout(()=>{
        res('输出啦')
    }, 1000)
})
a.then((res)=>{
//第二请求
    console.log(res);
    const p2 = new Promise (function(resolve, reject){
     setTimeout(()=>{
          resolve('第二');
      },2000)
    })
    return p2; // 重点在这,返回一个Promise
}).then((res)=>{
    //第三步 
    console.log(res); // 在这里可以拿到数据了第二步的
})

第二种,用await/async的方法:

const a = new Promise((res,rej)=>{
    //第一次请求
    setTimeout(()=>{
        res('输出啦')
    }, 1000)
})

const b = new Promise (function(resolve, reject) {
    setTimeout(()=>{
       resolve('第二');
    },2000)
})

const process = async function () {
    const step_1_result = await a;
    console.log(step_1_result);    
    const step_2_result = await b;
    console.log(step_2_result); 
    return step_2_result + '/我是从process函数来的'
    // ps: 或者可以这样return,都是一样的,如下:
    // return Promise.resolve(step_2_result + '/我是从process函数来的')
}

process().then(function (res) {
    console.log(res) // 这里拿到process过来的数据
})
function requestSth() {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res('data')
        }, 1000)
    })
}
function requestSth2() {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res('data2')
        }, 2000)
    })
}
function b(x, y) {
    console.log(x, y)
}
async function a() {
    let data = await requestSth()
    let data2 = await requestSth2()
    b(data, data2)
}
a()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题