Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将获取承诺嵌套在另一个承诺中(React)?_Javascript_Reactjs_Fetch_Es6 Promise - Fatal编程技术网

Javascript 将获取承诺嵌套在另一个承诺中(React)?

Javascript 将获取承诺嵌套在另一个承诺中(React)?,javascript,reactjs,fetch,es6-promise,Javascript,Reactjs,Fetch,Es6 Promise,我正在创建一个简单的React web应用程序,它将使用Reddit的api显示Reddit内容 handleLoad(event) { (() => { this.setState({ isLoading: true }); var newUrl = "https://www.reddit.com/r/" + this.state.search + ".json" return new Promise((resolv

我正在创建一个简单的React web应用程序,它将使用Reddit的api显示Reddit内容

handleLoad(event) {
    (() => {
        this.setState({
        isLoading: true
    });
    var newUrl = "https://www.reddit.com/r/" + this.state.search + ".json"
        return new Promise((resolve, reject) => {
            fetch(newUrl)
            .then((res) => {
                if(res.ok){
                    resolve(res.json())
                } else {
                    reject(res.status)
                }
            })
        }).then(data => {
            this.setState({
                info: data,
                isLoading: false,
                error: false
            })
        }).catch((message)=>{
            this.setState({
                isLoading: false,
                error: true
            })
        })
    })()
}

这段代码确实有效,但我想知道我是否做得太多了?我希望能够在子Reddit不存在或被阻止的情况下捕获任何错误,以便我的应用程序不会崩溃。

由于fetch已返回一个承诺,请在另一个承诺中处理响应。然后阻止,您不需要将其包装在另一个承诺中

快乐之路:

调用API 将响应解析为JSON 处理成功的响应 不那么快乐的道路: 1.调用API 2.检查res,如果不正常,则抛出状态错误 3.catch块将处理抛出的错误

例如:

var newUrl=https://www.reddit.com/r/emoji.json 获取新URL .thenres=>{ 如果!res.ok抛出新的Errorres.status; } .thenres=>res.json .thendata=>{ console.logdata//处理成功 }.catcherror=>{ console.logerror.message//处理失败
} 因为fetch已经返回了一个承诺,所以在另一个承诺中处理响应。然后阻塞,您不需要将它包装在另一个承诺中

快乐之路:

调用API 将响应解析为JSON 处理成功的响应 不那么快乐的道路: 1.调用API 2.检查res,如果不正常,则抛出状态错误 3.catch块将处理抛出的错误

例如:

var newUrl=https://www.reddit.com/r/emoji.json 获取新URL .thenres=>{ 如果!res.ok抛出新的Errorres.status; } .thenres=>res.json .thendata=>{ console.logdata//处理成功 }.catcherror=>{ console.logerror.message//处理失败
} 以下几点就足够了

如果您的承诺成功,则返回一个新的JSON承诺并相应地设置状态

如果没有,则在catch块中抛出一个错误,您已经在该块中处理该错误的setState

handleLoad(event) {
  (() => {
    this.setState({
      isLoading: true
    });
    var newUrl = "https://www.reddit.com/r/" + this.state.search + ".json"

    fetch(newUrl)
      .then((res) => {
        if (res.ok) {
          return res.json()
        }
        throw new Error('failed')
      })
      .then(data => {
        this.setState({
          info: data,
          isLoading: false,
          error: false
        })
      }).catch((message) => {
        this.setState({
          isLoading: false,
          error: true
        })
      })
  })()
}

以下几点就足够了

如果您的承诺成功,则返回一个新的JSON承诺并相应地设置状态

如果没有,则在catch块中抛出一个错误,您已经在该块中处理该错误的setState

handleLoad(event) {
  (() => {
    this.setState({
      isLoading: true
    });
    var newUrl = "https://www.reddit.com/r/" + this.state.search + ".json"

    fetch(newUrl)
      .then((res) => {
        if (res.ok) {
          return res.json()
        }
        throw new Error('failed')
      })
      .then(data => {
        this.setState({
          info: data,
          isLoading: false,
          error: false
        })
      }).catch((message) => {
        this.setState({
          isLoading: false,
          error: true
        })
      })
  })()
}

除掉外包装纸除掉外包装纸