定义一个变量然后调用它(未定义)

Defining a variable and then calling it (undefined)

我正在定义一个名为 filteredRecipes 的 const 变量,我正在尝试将其用于 setState。控制台报告 filteredRecipes 未定义,

Uncaught ReferenceError: filteredRecipes is not defined

我看不出我做错了什么?非常感谢任何帮助。

updateRecipeList () {
    const filteredRecipes = fetch('http://www.***.co.uk/rest/recipes.json')
        .then(res => res.json())
        .then(json => {

            json.results.filter(

                function (recipe) {
                    return (
                        this.state.currentRecipe === "" || recipe.pagetitle.toLowerCase().indexOf(this.state.currentRecipe.toLowerCase()) !== -1
                    )
                }.bind(this)

            );

        });

    this.setState({
        recipes: filteredRecipes
    });
}

您必须在 Promise 链的末尾执行此操作:

updateRecipeList() {
    return fetch('http://www.***.co.uk/rest/recipes.json')
        .then(res => res.json())
        .then(json => {

            // you also missed `return` here    
            return json.results.filter(

                function(recipe) {
                    return (
                        this.state.currentRecipe === "" || recipe.pagetitle.toLowerCase().indexOf(this.state.currentRecipe.toLowerCase()) !== -1
                    )
                }.bind(this)

            );

        })
        .then(filteredRecipes => {

            this.setState({
                recipes: filteredRecipes
            });

        });
}

我也稍微重构了你的代码,希望你不要介意。 :)

updateRecipeList() {
    return fetch('http://www.***.co.uk/rest/recipes.json')
        .then(res => res.json())
        .then(json => {
            if (this.state.currentRecipe !== "") {
                const currentRecipe = this.state.currentRecipe.toLowerCase()
                const filteredRecipes = json.results.filter(recipe => (
                    recipe.pagetitle.toLowerCase().includes(currentRecipe)
                ));

                this.setState({ recipes: filteredRecipes });
            }
            else {
                this.setState({ recipes: json.results });
            }
        });
}
updateRecipeList() {
  fetch('http://www.***.co.uk/rest/recipes.json')
    .then(res => res.json())
    .then(json => {
       const result = json.results.filter(recipe => {
           return (
            this.state.currentRecipe === "" || recipe.pagetitle.toLowerCase().indexOf(this.state.currentRecipe.toLowerCase()) !== -1
          );
        }
       this.setState({ recipes: result });
   );
 });
}

这是因为此线程是 运行 异步的,您需要承诺在设置 setState 时执行。

原因是因为您的 this.setState 在 Promise 之外,这意味着我不会在尝试执行该代码之前等待 Promise 完成。这意味着变量将是未定义的。

你可以像这样把它放在 promise 中来解决这个问题:

updateRecipeList() {
  const filteredRecipes = fetch('http://www.***.co.uk/rest/recipes.json')
    .then(res => res.json())
    .then(json => {
      json.results.filter(
        function(recipe) {
          return (
            this.state.currentRecipe === "" || recipe.pagetitle.toLowerCase().indexOf(this.state.currentRecipe.toLowerCase()) !== -1
          )
        }.bind(this)
      );
      this.setState({
        recipes: filteredRecipes
      });
    });


}

发生这种情况是因为提取是异步的,您可以通过在 then 部分设置状态来实现这一点:

updateRecipeList() {
const self = this;
fetch('http://www.***.co.uk/rest/recipes.json')
.then(res => res.json())
.then(json => {
    const filteredRecipes = json.results.filter(recipe =>
        self.state.currentRecipe === "" ||  recipe.pagetitle.toLowerCase().indexOf(self.state.currentRecipe.toLowerCase()) !== -1);

   self.setState({ recipes: filteredRecipes });
});

} 或者你可以使用 ES7 异步函数来获取结果:\

async updateRecipeList() {
  const res = await fetch('http://www.***.co.uk/rest/recipes.json');
  const recipies = await res.json();
  const filteredRecipes = recipies.results.filter(recipe =>
     this.state.currentRecipe === "" ||recipe.pagetitle.toLowerCase().indexOf(this.state.currentRecipe.toLowerCase()) !== -1

   this.setState({ recipes: filteredRecipes });

}