- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
提前谢谢大家。
我是第一次使用 ES6 原生 promise (过去,我使用过 Q 或 Angular 的 $q 服务)。我有一个问题可以通过使用 deferred 轻松解决,并且惊讶地发现 ES6 promises 不使用它们。
我更惊讶地发现博客上有很多人将 deferred 的用法称为反模式。即使在阅读了一些谴责使用 deferred 的博客之后,我仍然不太明白为什么 - 他们的例子大部分都是我从一开始就不会使用 deferred 的地方,所以也许我遗漏了一些东西(并且不介意解释顺便说一下为什么它们不好)。但是为了保持在最佳实践的范围内,我试图弄清楚如何在不引入支持它们的库的情况下解决问题,但我被困住了。
我正在使用 OpenLayers 库在我的 React/Redux 应用程序中创建 map 。 OpenLayers 需要一个 DOM 元素来在创建 map 对象时放置 map 。因此,在安装组件之前我无法实例化 OpenLayers map 。没关系,componentDidMount 有一个生命周期钩子(Hook)。
我遇到的问题是我需要将该 map 对象公开给其他类,而这些类的代码需要等到 map 创建后才能运行。
有了 deferred,我可以相当简单地处理这个问题,如下所示:
const deferred = Q.defer();
const Foo = React.createClass({
componentDidMount() {
const map = new ol.Map(...);
deferred.resolve(map);
}
...
}
export getMap => deferred.promise
但是对于 ES6 promise ,我被卡住了。
我无法在 componentDidMount 类之外实例化 promise ,因为它会立即触发。
如果我在 componentDidMount 函数的范围内实例化一个 promise(或使用 Promise.resolve,因为我的代码是同步的),则该 promise 超出了 getMap 函数的范围。
如果我在 componentDidMount 范围之外声明但不实例化 promise 对象,则 getMap 将返回 undefined 直到 componentDidMount 执行,首先破坏了拥有 promise 的意义。
作为最后的想法,我没有将 map 置于 Redux 状态,因为 OpenLayers map 是高度可变的并且做自己的事情,如果我将 map 放在那里,它会破坏 Redux 对不变性的 promise ......所以我已经放弃了 Redux 解决方案。在 Redux 状态上抛出某种 bool 值,比如“mapAvailable”,感觉就像一个 hack。我可能可以做到这一点,但它会引入许多次要问题。
那我错过了什么?我是在一个极端情况下,延期确实是正确的答案,还是我只是没有看到显而易见的东西?
再次感谢您的宝贵时间。
最佳答案
I was further surprised to discover a large number of people on blogs referring to the usage of deferred as an anti-pattern.
您似乎指的是 deferred antipattern这里是关于 deferred 的特定用法 - 它并没有说 deferred 是一种反模式。
尽管deferreds are deprecated尽管如此 :-) 您不需要任何延迟对象,resolve
函数就足够了。
I can't instantiate the promise outside of the
componentDidMount
class because it will fire immediately.
为什么要立即开火?只是不要那样做。你甚至可以把它包裹在类里面:
export const promise = new Promise(resolve => {
const Foo = React.createClass({
componentDidMount() {
const map = new ol.Map(…);
resolve(map);
}
…
}
… // do something with Foo here
});
但更有可能你会想要做
let resolve;
export const promise = new Promise(r => {
resolve = r;
});
export const Foo = React.createClass({
componentDidMount() {
const map = new ol.Map(…);
resolve(map);
}
…
}
当然请注意,这是一个可怕的模式 - 您刚刚创建了一个全局、静态 promise ,基本上是一个单例。当您的应用程序中可能拥有的任何 Foo
组件被挂载时,它将得到解决。不要那样做。我建议将 promise 放在组件的构造函数中,尽管我仍然不确定您到底需要它做什么。
关于javascript - ES6 Promises - 在不使用延迟的情况下,我如何保证最终访问在 React componentDidMount 函数期间实例化的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47417550/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!