如何使用async await 优化下列回调嵌套呢?

发布于 2022-09-12 00:13:08 字数 601 浏览 17 评论 0

伪代码:

getData = () => {
request({
    success: (res) => {
        console.log(res.data1)
        request({
            url: https://test.com/v1?data=res.data1,
            success: (res) => {
                conosle.log(res.data2)
                request({
                    url: https://test.com/v1?data=res.data2,
                    success: (res) => {
                        console.log(res.data3)
                    }
                });
            }
        });
    }
});
}

问题:如上所示每一次回调的返回值会作为下一个接口的入参,最终得到data3,那么如何使用async await方法优化回调嵌套呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

徒留西风 2022-09-19 00:13:08
async function asyncRequest(options) {
    return new Promise(resolve => {
        options.success = resolve;
        request(options);
    });
}

async function main() {
    const res1 = await asyncRequest({ url: url1});
    const res2 = await asyncRequest({ url: url2, data: res1});
    // ....
}

main();

代码没有验证,仅供参考,另请参考:

勿挽旧人 2022-09-19 00:13:08

因为是实例,故request的响应我就不按照data1,data2,data3这样命名了,统一成data.

function request(options) {
    setTimeout(() => {
        options.success({data: options.url});
    }, Math.random() * 30);
}

function promisify(api) {
    return function (options) {
        return new Promise(resolve => api({...options,success: resolve}));
    }
}

async function getData() {
    const requestP = promisify(request);
    const res1 = await requestP({url: '1'});
    const res2 = await requestP({url: res1.data + '2'})
    const res3 = await requestP({url: res2.data + '3'});
    console.log(res3.data); // '123'
}

getData()
寄风 2022-09-19 00:13:08

// request再次封装为promise

function fetch({url, data}){
   return new Promise((resolve,reject) => {
    request({
      url,
      data,
      success:(res) => {
        resolve(res)
      },
      fail: (err) => {
        reject(err)
      }
    })
   })
}

const getData = async () => {
  try{
    let result1 = await fetch({url: `https://test.com/v1`})
    let result2 = await fetch({url: `https://test.com/v1?data=${result1.data1}`})
    let result3 = await fetch({url: `https://test.com/v1?data=${result2.data2}`})
    console.log(result3)
  }catch(err){
    console.log(err)
  }
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文