TypeError: #<Promise> 不可迭代

Posted

技术标签:

【中文标题】TypeError: #<Promise> 不可迭代【英文标题】:TypeError: #<Promise> is not iterable 【发布时间】:2019-04-01 22:39:31 【问题描述】:

我试图使用 promise.all 进行多个 api 调用,但由于某种原因它抛出了以下错误

TypeError: # is not iterable

我的 Promise 相当简单(这可能是我第二次使用 Promise.all)

componentWillMount() 
    const id = this.props.location.pathname
    let axiosHome = axios.get('/home')
    let axiosUserData = axios.get("/profile/" + id)
    Promise.all(axiosHome,  axiosUserData).then(response => 
        console.log(response)
    ).catch(error => 
        console.log(error)
    )
  

问题:知道为什么我会收到此错误吗?另外,有人能解释一下我们什么时候用resolve关键字和promise吗?

【问题讨论】:

【参考方案1】:

Promise.all 接受单个参数,它是一个 Promises 的数组 - 随后的参数被丢弃。所以,改为传入一个数组:

Promise.all([axiosHome,  axiosUserData])
  .then(...

什么时候我们将 resolve 关键字与 promise 一起使用?

resolve 不是关键字,它只是构造Promise 时使用的常规函数​​名称:

const prom = new Promise((resolve, reject) => 
  // do some asynchronous stuff
  if (ok) resolve();
  else reject();
);

Promise 像这样显式构造时,调用 resolve() 来解决 Promise。 (当然,函数参数可以任意命名,不一定非得叫resolve

【讨论】:

【参考方案2】:

Promise.all() 接受方法数组(异步)并且可以将数据分配给变量 作为数组

示例:

let [axiosHomeData , axiosUserData] = await Promise.all([axiosHome,  axiosUserData]);

【讨论】:

以上是关于TypeError: #<Promise> 不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“Uncaught (in promise) TypeError: response.body.forEach is not a function”? (vue.js 2)

未捕获的 Promise 错误:TypeError:成员不是函数

vue控制台报 Uncaught (in promise) TypeError:

redux-promise:未捕获的 TypeError:中间件不是函数

正确使用 Promise.resolve().then() 错误:未捕获(在承诺中):TypeError:无法读取属性

Nodejs Promise TypeError:无法读取未定义的属性'then'