提问者:小点点

如何等待直到asyc调用链成功


我有一个函数,它正在进行一次异步调用,当调用成功时,它会进行另一次异步调用

例:-

    function1 = () => {
      /*Some required Logic*/
  return fetch("myurl")
      .then((json) => {
        function2(json)

      })
      .catch((error) => {
        console.log(error)
      })
}

function2 = () => {
  /*Some required Logic*/
  return fetch("myurl2")
      .then((json) => {
        callthirdfunction(json)

      })
      .catch((error) => {
        console.log(error)
      })
}

这里是函数3,在这个函数中,我依赖于函数1的成功

function3 = () => {
  /*Some required Logic*/
  function1().then(() => {
})
}

问题是它只在等待function1的asyc调用成功,而不是在等待function2的async调用成功

我知道我能写出像链一样的asyn call,但由于不可避免的情况,这是不可能的

在这方面任何建议或线索都将大有帮助


共3个答案

匿名用户

如果您使用了标签中提到的异步等待,那么您可以这样使用它:

await function1();
await function2();
await function3();

async关键字添加到函数声明时:

function1 = async () => {

}

另一种选择是允诺您的函数,然后像这样调用它们:

function1()
.then(function2)
.then(function3)
.catch() {}

匿名用户

如果希望一个承诺依赖于另一个承诺,则需要返回then依赖的承诺。

您的代码不对function2的结果执行任何操作:

return fetch("myurl")
  .then((json) => {
    function2(json)

  })

应改为

.then((json) => {
  return function2(json)
})

then的全部要点在于,它允许通过从回调返回后续承诺来链接这些承诺。

匿名用户

只有当你兑现承诺时,承诺才会被束缚。在下面的示例中

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}


async function add1(x) {
  const a = await resolveAfter2Seconds(20);
  const b = await resolveAfter2Seconds(30);
  return x + a + b;
}

注意resolveafter2seconds中的return关键字。确保在调用激发promise的方法时添加“return”关键字