承诺与异步/等待React中的正同步



我到目前为止看到的所有正式文档和示例都使用异步执行的承诺,例如(从学习的道路上学习React Book):

class App extends Component {
    //...
    fetchSearchTopStories(searchTerm, page = 0) {
        fetch(`${PATH_SEARCH}?${PARAM_SEARCH}${searchTerm}`)
            .then(result => this.setSearchTopStories(result.data))
            .catch(error => this.setState({ error }));
    }
    //...
}

为什么要以首选方式承诺?它可以阻止以这种方式使用async/await?:

class App extends Component {
    //...
    async fetchSearchTopStories(searchTerm, page = 0) {
        try {
            const result = await fetch(`${PATH_SEARCH}?${PARAM_SEARCH}${searchTerm}`);
            this.setSearchTopStories(result.data);
        } catch (error) {
            this.setState({ error });
        }
    }
    //...
}

javaScript的目的已经是多个范式语言(尽管由于其构造而经常被归类为A 功能性与此特定范式更容易相关)。例如,不久前JS对面向对象的编程方法的支持是存在但众所周知的,因为您会声明一个函数并提供方法,属性等,这将使该函数能够实际工作,并且是,并且一个班级(尽管有些奇怪,反直觉)。

然而,最近的JavaScript在世界上的流行状况一直在增长,这是在世界意识到Node.js的潜力之后开始的。事实上,多范式的支持更加重视,然后ES6于2015年推出,旨在解决JavaScript环境中如此普遍(并受到批评)的黑客,非标准化的结构。

用ES6获得了对对象取向的更为明显的支持(例如class关键字),但是,鉴于JS迄今为止JS的声誉不佳,到目前为止,Ecmascript委员会显然正在努力补偿。await关键字是此尝试的效果,因为JS中的异步编程通常是通过功能方法进行的,将一个接一个的函数链接到一个接一个的函数,一旦以前的函数完成了执行,每个执行都很有意义,因为这是很有意义的,因为诸如向外部服务器请求之类的东西不能合理地预测其确切的响应时间)。await提供了解决此问题的结构化方法的可能性(在一个非常简化的解释中,结构化编程意味着"一条代码立即立即执行另一个代码"),因为没有awaitfetch将返回未解决的承诺,并且代码将遵循其执行忽略忽略,fetch的实际响应,但是使用await关键字,代码将停止执行,直到实际响应到来(外部服务器的数据或错误,而不是承诺)。

因此,即使可以将它们视为等效,功能性方法已经存在了更多的时间,因此 JS方法做事。

虽然可以通过(承诺和异步/等待)实现相同的结果,但它们之间仍然存在较小的差异:

  • 只有承诺链本身是异步< = > 整个异步包装功能是异步的

承诺的存在比异步/等待风格更长,还有更多的示例,并且有效。

我个人更喜欢等待/异步风格,因为它看起来更干净,并且错误处理更好,尤其是链接时。

最终,您使用哪一个都可以工作。

最新更新