两个异步函数和第三个函数在前两个函数执行后执行

Two asynchronous functions and third function to be executed after first two is executed

说,我有三个 javascript 函数

  1. function1和function2异步执行
  2. function2在前两个执行完后执行

如何解决?

您可以使用 Promise.all() (see here)

来自 MDN 的示例:

var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});
// expected output: Array [3, 42, "foo"]
const promise1 = fn1();
const promise2 = fn2();

Promise.all([promise1, promise2])
  .then(values => {
    // Your code
});

对于 async/await,您必须将 fn1fn2 声明为异步,然后:

const promise1 = await fn1();
const promise2 = await fn2();

// Now the two vars contain resolved promises

async/await 可能更具可读性,但它会花费更多时间,因为 fn2()fn1() 的承诺完成之前不会执行。在 Promise.all 的第一个示例中,两个函数是并行调用的,因此性能会稍微好一些。

如果您想了解更多信息,请查看 Jake Archibald 关于 async/await 的这篇精彩文章:https://developers.google.com/web/fundamentals/primers/async-functions

承诺链或异步等待关键字的想法应该适合您。请参阅下面的承诺链接示例。

新承诺(函数(解决,拒绝){

}).then(函数(结果){

}).then(函数(结果){

}).then(函数(结果){

});

您可以像这样链接承诺:

function f1() {
            return new Promise(function(resolve) {
                setTimeout(() => resolve('f1'), 1000);
            });
        }
        function f2() {
            return new Promise(function(resolve) {
                setTimeout(() => resolve('f2'), 1000);
            });
        }
        function f3() {
            return new Promise(function(resolve) {
                setTimeout(() => resolve('f3'), 1000);
            });
        }

// Chain promises
        f1()
          .then((res) => {
            console.log(res + ' done!')
            return f2()
          })
          .then((res) => {
            console.log(res + ' done!')
            return f3()
          })
          .then((res) => {
            console.log(res + ' done!')
          })

或者您可以对承诺进行分组:

        function f1() {
            return new Promise(function(resolve) {
                setTimeout(() => resolve('f1'), 1000);
            });
        }
        function f2() {
            return new Promise(function(resolve) {
                setTimeout(() => resolve('f2'), 1000);
            });
        }
        function f3() {
            return new Promise(function(resolve) {
                setTimeout(() => resolve('f3'), 1000);
            });
        }
        
// Group promises
        Promise.all([f1(), f2()])  
          .then((responses) => {
            console.log(responses.join(', ') + ' done!')
            return f3()
          })
          .then((res) => {
            console.log(res + ' done!')
          })

谢谢大家。我尝试了你所有的解决方案。不太奏效。尝试了一段时间后,我自己创建了一个解决方案。这是:

let promise1 = new Promise(function(resolve, reject) {
  setTimeout(() => resolve("promise1"), 1000);
});

let promise2 = new Promise(function(resolve, reject) {
  setTimeout(() => resolve("promise2"), 4000);
});

Promise.all([promise1, promise2])
.then(result => {
  console.log(result);
});

它创建了两个函数,运行将这两个函数作为 resolve。然后在数组中传给Promise.all,第三个函数可以在Promise.all.

的then块中运行