【问题标题】:Javascript Promise.all not show lastJavascript Promise.all 不显示最后
【发布时间】:2018-07-02 22:06:11
【问题描述】:

我有几个函数返回一个承诺。

有一个启动函数执行另一个函数。

由于这些是承诺,而我正在使用 Promise.all,理论上,Promise.all 应该仅在所有其他承诺完成后才显示。

代码如下:

arr = [];

function start() {
  var aPromiseMain = new Promise((resolve, reject) => {
    myfunction();
    arr.push('start');
    resolve(console.log('I am start'))
  })
  return aPromiseMain
}

start();

function myfunction() {
  var aPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
      arr.push('I am myfunction');
      resolve(console.log('I am myfunction'))
    }, 2000)
  })
  return aPromise
}

Promise.all(arr).then(values => {
  console.log(values);
});

发生的事情是顺序如下:

  1. 我开始了
  2. Promise.all 正在显示
  3. 我是myfunction

应该是:

  1. 我开始了
  2. 我是myfunction
  3. Promise.all

我该如何解决这个问题?

【问题讨论】:

  • 你永远不会将任何这些 Promise 值放入数组中;你只是在推动字符串。
  • 问题是如果我将字符串添加到resolve('I am start');我只能传递一个,所以如果在同一个函数中我想在代码的不同部分传递 2 个不同的值,我会遇到问题
  • 不不;返回的 Promise 实例都被忽略。这些是需要进入数组的东西,而不是字符串。它与您传递给resolve() 的内容无关。
  • 您的实现不正确。 Promise.all 是你传递一系列承诺的地方。相反,您传递的是一个字符串数组。您不必为当前的实现使用 Promise.all。如果你想做承诺链,那么你可以使用 Promise.all。
  • 所以基本上你只是在做Promise.all([1,2,3]).then(console.log)

标签: javascript promise


【解决方案1】:

您的数组应该是 promises 数组,而不是字符串数组。

arr = [];
    
    function start() {
        var aPromiseMain = new Promise((resolve, reject) => {
            resolve('I am start')
        })
        return aPromiseMain
    }
    
    function myfunction() {
        var aPromise = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('I am myfunction')
            }, 2000)
        })
        return aPromise
    }
    
    arr.push(start());
    arr.push(myfunction());
    
    Promise.all(arr).then(values => {
        console.log(values);
        console.log("I am done");
    });

【讨论】:

  • 好吧,myfunction() 是从 start() 函数内部调用的,所以这就是将 Promise 推送到数组的地方。
  • myfunction() 承诺在这里执行了两次,虽然它只记录了一次
  • 有些混乱:您正在使用promise.all 并行执行承诺,但根据您的描述,听起来您需要使用a_promise.then() 来串行运行它们。你需要哪一个?
  • 是的 myfunction() 运行了两次
【解决方案2】:

从作者的描述和 cmets 看来,他们可能需要串联运行 Promise,所以这里有一个替代方案:

arr = [];

function start() {
  console.log("I have started");
  var aPromiseMain = new Promise((resolve, reject) => {
    myfunction().then((result) => {
      console.log('I am finished');
    }); 
  })
  return aPromiseMain
}

function myfunction() {
  var aPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(console.log('I am myfunction'))
    }, 2000)
  })
  return aPromise
}

start();

【讨论】:

    【解决方案3】:

    您的代码arr.push('start');(例如)只是将一个字符串添加到数组中。 Promise.all 需要访问实际的 Promise 对象,而不是字符串。它不能对字符串做任何有用的事情。同样将console.log 的结果作为值发送给resolve 函数是没有意义的——这个参数的想法是给监听器一些数据作为结果——console.log 记录事情,但它不返回数据。

    此示例将 Promise 对象推送到数组中,以便 Promise.all 将等待每个对象完成后再执行,并在 Promise 解析时发送有意义的响应。

    arr = [];
    
    
    function start() {
      var aPromiseMain = new Promise((resolve, reject) => {
        console.log("start");
        myfunction();
        resolve('I am start');
      });
      arr.push(aPromiseMain);
      return;
    }
    
    start();
    
    
    function myfunction() {
      var aPromise = new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log("myfunction");
          resolve('I am myfunction');
        }, 2000)
      })
      arr.push(aPromise);
      return;
    }
    
    Promise.all(arr).then(values => {
      console.log(values);
    });

    【讨论】:

      【解决方案4】:
      function start() {
        return new Promise((resolve, reject) => {
          myfunction();
          arr.push('start');
          resolve(console.log('I am start'))
        })
      }
      function myfunction() {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            arr.push('I am myfunction');
            resolve(console.log('I am myfunction'))
          }, 2000)
        })
      }
      var arr = [start(), myfunction()]
      Promise.all(arr).then(values => {
        console.log(values);
      });
      

      试试这个方法。

      【讨论】:

      • 为什么不删除不必要的字符串推入数组?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多