Javascript Promise.all不在最后显示

时间:2018-07-02 13:43:21

标签: javascript promise

我有一些返回承诺的函数。

有一个启动功能可以执行另一个功能。

由于这些是承诺,因此我使用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

我该如何解决?

4 个答案:

答案 0 :(得分:3)

您的数组应该是 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");
    });

答案 1 :(得分:1)

例如,您的代码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);
});

答案 2 :(得分:1)

从作者的描述和评论看来,他们可能需要按顺序履行承诺,所以这里有一个替代方案:

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 :(得分:-2)

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);
});

尝试一下。