我从函数返回一个promises列表,我需要获取该数组的值。因此,我使用Promise.all
功能。但这对我来说并不是很好。我收到此错误:
Uncaught (in promise) TypeError: undefined is not a function
at Function.all (<anonymous>)
at new MySearchesTable (my-searches-table.js:162)
at constructClassInstance (react-dom.development.js:6801)
此处出现错误。
class MySearchesTable extends React.Component {
constructor(props, context) {
super(props, context);
let data = Promise.all(modelInstance.getSearchHistory()); // Error traceback starts here!
this.state = {
selected: [],
data: data,
page: 0,
rowsPerPage: 5,
open: false,
};
这里是返回承诺列表的函数:
/*
* Gets searches for logged in user
*/
this.getSearchHistory = function(){
let currUserSearches;
return new Promise((resolve, reject)=>{
firebase.auth().onAuthStateChanged(function(user){
if(user){
let uid = user.uid;
let userRef = database.ref("users/"+uid);
return userRef.once("value")
.then( (value) => {
let currUserSearchesIDs = value.val();
console.log("currUserSearches:");
let currUserSearches = currUserSearchesIDs.map( searchID => {
return database.ref("searches/"+searchID).once("value")
.then( (value) => {
let obj = value.val();
obj["id"] = searchID;
return obj;
});
});
console.log(currUserSearches);
resolve(currUserSearches);
});
}else{
reject("Must log in"); // user must log in
}
}
)
});
}
出现此错误的原因是什么?如何成功获取数据库中的值列表?
答案 0 :(得分:3)
原因是Promise.all
需要iterable
。您只返回 1个承诺。
查找
在上面的示例中,我使用Promise.all
并向其传递了一个Promise
。 Promise.resolve(null)
的结果是1个promise,它解析为null。
传递Promise
数组时,错误不会发生:
Promise.all([Promise.resolve(null)])
话虽如此,我必须指出你应该重新考虑你的设计,因为你不应该等待构造函数的承诺。请使用componentDidMount
。组件的第一个渲染应该data
为null,并最终显示加载指示符。在componentDidMount
上,触发数据提取部分。返回数据后,重新渲染组件,现在已经获取了数据。