TypeError:无法读取未定义的属性'then'-React Hooks

时间:2019-10-13 00:57:03

标签: javascript reactjs

我是React的新手,我正在创建一个网站,用户可以在其中搜索查询并显示结果。

我有一个名为Searchbar的组件,它包含两个功能:

1) 用户编写查询,并在用户自定义输入时通过axios POST请求发送到后端。

2)后端搜索相对查询,并通过axios GET请求将结果发送回去。

因此顺序为:postQuery()-->getQueryResult(),所以我认为postQuery()创造了一个承诺,如果解决了,它就允许getQueryResult()运行。 但是我得到了:

  
    

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

         

第38行出现错误:返回postQuery(query).then(()=> getQueryResult());

  

我的代码是:

function Searchbar() {

    const [query, setQuery] = useState("");
  const [results, setResults] = useState(["myemptyinitiallist"]);

  function postQuery(query) {
    var myParams = {
         data: query
    }
    axios.post('http://localhost:5000/api/query', myParams)
      .then(function(response){
        console.log("Yes, it sends the query in JSON format to Flask");
      })
      .catch(function(error){
        console.log(error, "Error on AXIOS post");
      });
  } // Enf of postQuery

  function getQueryResult() {
    (axios.get('http://localhost:5000/api/query')
    .then(function (response) {
      setResults(response.data); //set the value
      console.log(results)
    }))
  } // End getQueryResult()

    function handleEnter(query){
        if (query != "") {
      return postQuery(query).then(() => getQueryResult());
    } else {
        alert("The search query cannot be empty")
      }
  } // End of function handleEnter()


    return(
    <div>
        <SearchBar
            onChange={(event) => setQuery(event)}
            onRequestSearch={() => handleEnter(query)}
            style={{
                marginTop: 200,
                marginLeft: 'auto',
                marginRight: 'auto',
                maxWidth: 800,
            }}
        />
      <ResultList/>
</div>
    )
}


export default Searchbar;

1 个答案:

答案 0 :(得分:1)

postQuery中没有return语句,因此它返回undefined。 另外,catch子句默认情况下履行其返回的promise。为了也可以捕获返回承诺,请在catch回调中重新抛出错误。

尝试

  function postQuery(query) {
    var myParams = {
         data: query
    }
    return axios.post('http://localhost:5000/api/query', myParams)
      .then(function(response){
        console.log("Yes, it sends the query in JSON format to Flask");
      })
      .catch(function(error){
        console.log(error, "Error on AXIOS post");
        throw error; // don't fulfill returned promise
      });
  } // End of postQuery