Promise.all错误:未捕获(承诺)TypeError:#<promise>不可迭代

时间:2018-10-23 03:15:46

标签: javascript reactjs promise

因此,我需要点击2个API,然后等待两个响应返回,然后再分派动作。

我正在使用Promise.all,但遇到以下错误:

  

index.js:51未捕获(承诺)TypeError:#不可迭代       在Function.all()

const fetchPrices = () => Promise.resolve(getPrices());
const fetchSupplies = () => Promise.resolve(getSupply());
const fetchAll = () => Promise.all(fetchPrices(), fetchSupplies()).then((resultsArray) => {
  return resultsArray;
});

// GET coins from coinmarketcap Pro API v1.
export const startGetPrices = () => dispatch => fetchAll().then((res) => {
  console.log('res', res);
  //...
});

enter image description here

1 个答案:

答案 0 :(得分:3)

Promise.all接受Promises array ,而不是在参数列表中依次列出的Promises。更改为:

const fetchAll = () => Promise.all([
  fetchPrices(),
  fetchSupplies()
]);

请注意

.then((resultsArray) => {
  return resultsArray;
});

是多余的;现有的Promise解析为一个结果数组,因此在其上调用.then以将另一个 Promise链接到其上,并采用该结果数组并解析为数组没有任何用处;您可以完全取消它。

此外,也不需要使用Promise.resolve-我不知道getPricesgetSupply会返回什么,但是如果您将非承诺传递给Promise.all,则不会错误将被抛出,结果数组将仅包含这些值。 (如果返回了Promises,则Promise.all将在所有这些Promises都解决后解决。)因此,您可以这样做:

const fetchAll = () => Promise.all([
  getPrices(),
  getSupply()
]);

(当然,如果getPricesgetSupply都返回非承诺,那么首先就不需要Promise.all