Promise.all引发TypeError:undefined不是函数

时间:2018-05-06 10:54:39

标签: javascript reactjs

我从函数返回一个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
      }
      }
    )
    });

  }

出现此错误的原因是什么?如何成功获取数据库中的值列表?

1 个答案:

答案 0 :(得分:3)

原因是Promise.all需要iterable。您只返回 1个承诺

查找

enter image description here

在上面的示例中,我使用Promise.all并向其传递了一个PromisePromise.resolve(null)的结果是1个promise,它解析为null。

传递Promise数组时,错误不会发生:

Promise.all([Promise.resolve(null)])

话虽如此,我必须指出你应该重新考虑你的设计,因为你不应该等待构造函数的承诺。请使用componentDidMount。组件的第一个渲染应该data为null,并最终显示加载指示符。在componentDidMount上,触发数据提取部分。返回数据后,重新渲染组件,现在已经获取了数据。