javascript - 如何异步多次调用 promise 函数以用给定数量的值填充数组?

标签 javascript arrays asynchronous promise

我有一个 promise 函数,它可以成功地返回一个介于最小值和最大值之间的随机整数。

const getRandomValue = (min = 0, max = 1) => {
  return new Promise(function(resolve, reject){
    let randomInteger = Math.floor(Math.random() * (max - min)) + min;
    resolve(randomInteger);
  });
};

我正在尝试使用此 promise 函数异步填充数组,其中包含 4 个随机整数。

通话的时间顺序对我来说是一个挑战,我对这种类型的编程是全新的。以下是我一直在尝试但没有成功的工作。

  const getFourRandomValues = (min, max) => {
    let randomIntegerArray = [];
    for(let i = 0; i < 4; i++){
      getRandomValue(20,30).then(x => console.log(x));
      getRandomValue(20,30).then(x => {
        randomIntegerArray.push(x)
      });
    }
    return randomIntegerArray;
  };

console.log(getFourRandomValues());

有经验的程序员肯定知道,它会产生:

[]
22
29
25
21

非常感谢所有帮助

最佳答案

请注意,如果您执行异步操作,则只有在同步代码之后才会解析或拒绝,这就是为什么在您的示例中您得到一个空数组。您可以使用 Promise.all 轻松避免它,我推荐它用于您的情况,因为您正在使用多个异步调用。

逻辑如下:

  1. 将每个异步调用推送到数组中。

  2. 调用Promise.all(arrayOfPromises)

  3. 通过 .then() block 处理结果(在 then 中,如果每个调用都成功解析,您可以访问每个调用的结果)

这是一个例子:

const getRandomValue = (min = 0, max = 1) => {
  return new Promise(function(resolve, reject){
    let randomInteger = Math.floor(Math.random() * (max - min)) + min;
    resolve(randomInteger);
  });
};

const getFourRandomValues = (min, max) => {
  let promises = [];
  for(let i = 0; i < 4; i++) {
    promises.push(getRandomValue(20,30));
  }
  return Promise.all(promises);
}

getFourRandomValues()
  .then(x => console.log(x));

关于javascript - 如何异步多次调用 promise 函数以用给定数量的值填充数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53631287/

相关文章:

javascript - if/else 列出可能的日期条件永远不会成功

php - 在多维数组中查找特定键并返回值

asynchronous - python-requests 是否支持 HTTP2 和异步调用?

python - 如何在 Python 中并行化 I/O 绑定(bind)操作?

javascript - ajax调用成功后添加文本区域

javascript - 导航元素的滑动背景仅适用于 2 个元素,不能更多

c++ - SDL 纹理数组?

javascript - 数据请求有时是异步的

javascript - 如果引用者使用 https,如何通过 JavaScript 获取正确的引用者?

python - 为 OpenCV imshow 连接 Numpy 数组