Javascript Promise将值推入数组(仅从函数还是外部?)

时间:2018-06-30 10:17:43

标签: javascript promise es6-promise

我有一些诺言和一个Promise.all:

array = [];


  var one = new Promise(function(resolve, reject) {
    // Do stuff
    setTimeout(function() {
      resolve('One Done');
      array.push('one');
    }, 5000);
  });


  var two = new Promise(function(resolve, reject) {
    // Do Stuff
    resolve('Two Done');
    array.push('two');
  });


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

我们知道这行不通,因为array.push必须在外面。

我目前有一些需要由promise调用的功能,以便最终可以在Promise.all中使用它。

建议像这样从promise内部调用函数:

    function dosomething() {
        // does something
        array.push('something');
    }

  var mypromise = new Promise(function(resolve, reject) {
    dosomething();
    resolve('Did something');
  });

或者有更明智的方法吗?

3 个答案:

答案 0 :(得分:3)

Promise.All期望有一系列的Promise,并会等到所有Promise都兑现后,为您提供每个Promise的结果,或者在任何Promise失败的情况下提供给您。

如果您愿意使用多个对象(而不只是一个字符串)来解析它们,则可以使用任何类型的对象来解析它们,并且以后可以以任何所需的方式使用结果,因此可以避免从答应,而是将“工作项”作为一个整体来解决,并在异步评估后使用所有必需的结果。

(我认为)这还将使代码更整洁,更易于管理。

您可以尝试执行以下操作:

   var valuesArray=[];

   var prom1 = new Promise(function(resolve, reject) {
        // Do stuff
        setTimeout(function() {
          resolve({ msg: 'One Done', data : 'one'});
          // array.push('one');
        }, 5000);
      });

    var prom2 = new Promise(function(resolve, reject) {
        // Do Stuff
        resolve({ msg: 'Two Done', data : 'two'});
        // array.push('two');
      });

   var promisesArray= [prom1,prom2]; 

   Promise.all(promisesArray).then(values => {
        // do stuff with values here
        console.log(values[0].msg);
        console.log(values[1].msg);
        valuesArray.push(values[0].data);
        valuesArray.push(values[0].data);
      });

答案 1 :(得分:2)

Promise.all等待Promises的数组。在您的示例中,您始终将string类型推入数组。这显然行不通。在第一个示例中,您想自己兑现承诺:

array = [];


  var one = new Promise(function(resolve, reject) {
    // Do stuff
    setTimeout(function() {
      resolve('One Done');
    }, 5000);
  });

  array.push(one);


  var two = new Promise(function(resolve, reject) {
    // Do Stuff
    resolve('Two Done');
  });

  array.push(two);

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

只要数组包含Promise个对象,Promise.all就会按预期工作。

答案 2 :(得分:0)

我认为,如果您使用Promises数组调用Promise.all,而每个Promise都解析为所需的值,则根本不需要外部数组也不使用push,这将是最清晰的:

var one = new Promise(function(resolve, reject) {
  // Do stuff
  setTimeout(function() {
    console.log('One Done')
    resolve('one');
  }, 1000);
});


var two = new Promise(function(resolve, reject) {
  // Do Stuff
  console.log('Two Done');
  resolve('two');
});


Promise.all([one, two]).then(arr => {
  console.log(arr);
});

如果您需要两个值('One Done' 'one'),则可以使用同时包含两个值的数组来解析初始promise,从而可以完成所有操作'One Done',然后解析为'one'Promise.all创建的数组链接:

const logAndReturn = ([logStr, finalResolveStr]) => {
  console.log(logStr);
  return finalResolveStr;
}
var one = new Promise(function(resolve, reject) {
  // Do stuff
  setTimeout(function() {
    resolve(['One Done', 'one']);
  }, 1000);
});


var two = new Promise(function(resolve, reject) {
  // Do Stuff
  resolve(['Two Done', 'two']);
});


Promise.all([
  one.then(logAndReturn),
  two.then(logAndReturn),
]).then(arr => {
  console.log(arr);
});