如何等待asti连锁的asyc调用成功

时间:2017-07-04 14:06:56

标签: javascript jquery ajax async-await

我有一个正在进行异步调用的函数 并且在成功时,它进行另一次异步呼叫

例如: -

    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 我依赖于function1

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

问题是它只是等待,直到function1的asyc调用成功,它不等待function2的异步调用才能成功

我知道我可以像asyn调用链一样写,但由于不可避免的情况,它不可能

在这方面的任何建议或领导都会有很大的帮助

3 个答案:

答案 0 :(得分:0)

如果您在标记中使用了async await,则可以像这样使用它:

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

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

function1 = async () => {

}

另一种选择是promisify你的功能,然后像这样调用它们:

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

答案 1 :(得分:0)

如果您希望一个承诺依赖另一个承诺,您需要return来自then的承诺承诺。

您的代码不会执行结果为function2的任何内容:

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

  })

应该阅读

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

then的重点在于它允许通过从回调中返回它们来链接后续的承诺。

答案 2 :(得分:0)

Promise只有在你返回时才被链接。在下面的例子中

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关键字。确保当您调用触发承诺的方法时,添加' return'关键字