Async/Await 如何实现各自执行

新手上路,请多包涵
function getTimeOut1() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('===5000ms===');
        }, 5000);
    });
}

function getTimeOut2() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('===2000ms===');
        }, 2000);
    });
}

如何用async/await实现这种(分头执行)的效果:

getTimeOut1().then(res => {
    console.log(res);
});

getTimeOut2().then(res => {
    console.log(res);
});
  • 普通的await会等a的返回结果出来再执行b ---> 8000ms+
const a = await getTimeOut1();
const b = await getTimeOut2();
  • 用Promise.all([...p])的形式,虽然是并行操作,但会等最慢的一次执行完才会返回结果。---> 5000ms+

所以没有想明白如何用async/await实现常规的并行回调。

阅读 3.3k
5 个回答
async function logInOrder(urls) {
  // 并发读取远程URL
  const textPromises = urls.map(async url => {
    const response = await fetch(url);
    return response.text();
  });

  // 按次序输出
  for (const textPromise of textPromises) {
    console.log(await textPromise);
  }
}

上面代码中,虽然map方法的参数是async函数,但它是并发执行的,因为只有async函数内部是继发执行,外部不受影响。后面的for..of循环内部使用了await,因此实现了按顺序输出。

希望这个答案可以帮到你,谢谢采纳意见!

先执行,只等待结果,而不是等待其中之一的结果再执行。

let p1 = getTimeOut1()
let p2 = getTimeOut2()
const a = await p1();
const b = await p2();

不可以用 async/await 实现你想要的并行回调,因为 await 只能 resolve 一个 promise(Promise.all 最终也是将多个 Promise 变为一个),也就是 await 只能解决一次回调,不满足你希望多次回调的需求。如果希望回调多次,只能使用多次 .then,或封装成一个类似 Promise.all 和 Promise.race 方法(比如叫 Promise.every)。如果业务简单,建议还是直接使用 2 次 .then:

getTimeOut1().then(() => {...})
getTimeOut2().then(() => {...})
新手上路,请多包涵

处理方式:再封装一个async函数

const callback = {
    async a() {
        await getTimeOut1();
        do sth...
    },
    async b() {
        await getTimeOut2();
        do sth...
    }
};
async () => {
    await Promise.all([
        callback.a(),
        callback.b()
    ]);
} 

你这俩又没有依赖关系,写两个async函数不就行了。一个函数当然只能描述一套同步逻辑,js又没有goto

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题