Promise.all到底是做什么的?

时间:2020-09-17 14:20:37

标签: javascript asynchronous promise resolve

我试图在这里了解Promise。 我在这里所做的是使用Promise.all隐藏下面的代码以达到相同的结果。 我了解Promise都结合了data1,data2。 我的问题是,Promise.All在没有解决方法的情况下如何工作? Promise是否可以在方法本身内解析这些数据?

请告知。

const readAllUsersChaining = () => {
  return new Promise((resolve, reject) => {
    let result = [];
    getDataFromFilePromise(user1Path)
      .then((data) => {
        result.push(JSON.parse(data)); // what are you doing? he's gone mad...
        return getDataFromFilePromise(user2Path);
      })
      .then((data) => {
        result.push(JSON.parse(data));
        result ? resolve(result) : reject(result);
      });
  });
};

const readAllUsers = () => {
  const data1 = getDataFromFilePromise(user1Path);
  const data2 = getDataFromFilePromise(user2Path);
  console.log(data1, data2);
  return Promise.all([data1, data2]).then((data) => {
    return data.map((el) => JSON.parse(el));
  });
};

enter image description here

2 个答案:

答案 0 :(得分:1)

我的问题是Promise.All在没有解决方法的情况下如何工作?

不太清楚您的意思。 Promise.all只是在内部创建一个新的承诺,当所有其他承诺都得到解决时,新的承诺就会得到解决。

这是Promise.all的一个简单实现,用于始终保证有参数的情况:

function all(promises) {
  if (promises.length === 0) {
    return Promise.resolve([]);
  }
  return new Promise((resolve, reject) => {
    const results = [];
    let resolved = 0;
    promises.forEach((promise, i) => {
      promise.then(
        result => {
          results[i] = result;
          resolved++;
          if (resolved === promised.length) {
            resolve(results);
          }
        },
        error => reject(error)
      );
  });
}

答案 1 :(得分:0)

Promise.all可以等到then方法附加执行之前,将所有作为参数传递的promise都填满。

真正的用例是当您必须对API执行5次调用时,仅当您从所有API调用中获取数据时,才想执行某些处理。您可以依靠Promise.all函数,该函数将等待所有通过的答应答应完成的请求在转弯时被完全归档。

下面我提供一个Promise.all调用的示例。其中有两个承诺作为参数传递。第一个有一个计时器,它会在5秒钟后充满它,第二个如果立即满,则立即充满。 Promise.all仅在两个承诺都作为实参传递时都被实兑

const firstPromise = new Promise((resolve, reject) => {

   setTimeout(()=> {
      return resolve({
          name: "First Promise"
       });
   }, 5000);
   
});

const secondPromise = new Promise((resolve, reject) => {
   return resolve({
      name: "Second Promise"
   });
})

const all = Promise.all([firstPromise, secondPromise]).then((response) => {
    console.log(response);
});