- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在异步操作中使用 RefluxJS 存储时,您很容易在操作之间出现竞争条件。
问题的摘要描述
例如,我们的 store 处于状态 X。从 X 调用了一个异步操作 A,在它完成之前,另一个异步操作 B 被调用,也是从 X 调用的。从这里开始,无论哪个操作先完成,都会出错。
A B
X -> Y -> Z
A
X -> Y1 .--> Y2
\ /
'----'
B
var Q = require('q');
var Reflux = require('reflux');
var RefluxPromise = require('reflux-promise');
Reflux.use(RefluxPromise(Q.Promise));
var AsyncActions = Reflux.createActions({
'add': { asyncResult: true }
});
var AsyncStore = Reflux.createStore({
init: function () {
// The state
this.counter = 0;
AsyncActions.add.listenAndPromise(this.onAdd, this);
},
// Increment counter after a delay
onAdd: function(n, delay) {
var that = this;
return apiAdd(this.counter, n, delay)
.then(function (newCounter) {
that.counter = newCounter;
that.trigger(that.counter);
});
}
});
// Simulate an API call, that makes the add computation. The delay
// parameter is used for testing.
// @return {Promise<Number>}
function apiAdd(counter, n, delay) {
var result = Q.defer();
setTimeout(function () {
result.resolve(counter + n);
}, delay);
return result.promise;
}
// Log the store triggers
AsyncStore.listen(console.log.bind(undefined, 'Triggered'));
// Add 3 after 1 seconds.
AsyncActions.add(3, 1000);
// Add 100 almost immediately
AsyncActions.add(100, 1);
// Console output:
// > Triggered 100
// > Triggered 3
// Desired output (queued actions):
// > Triggered 3
// > Triggered 103
{
"dependencies": {
"q": "^1.3.0",
"reflux": "^0.3",
"reflux-promise": "^1"
}
}
最佳答案
您的示例似乎更像是“事实来源”概念的问题,而不是其他任何问题。您仅存储号码客户端的当前状态,但仅在收到服务器端对正在执行的操作的确认后才更新它。
当然会出问题。您正在以一种奇怪的方式混合对数字的操作和数字的存储,其中在任何给定时刻都没有单一的真实来源。在 Action 被称为完成的时间之间处于不确定状态……这不好。
要么在客户端存储号码,每次添加时,直接添加到该号码,然后告诉服务器端新号码是什么......(即客户端负责作为号码的真实来源当客户端运行时)
或者存储服务器端的号码,每次从客户端启动它时,服务器都会返回新的更新号码。 (即数字的真实来源完全是服务器端)。
然后,即使发生种族问题,您仍然有数字的真实来源,并且可以检查和确认该来源。例如,如果服务器端持有数字的真实来源,那么 API 还可以在每次返回该值时返回该值状态的时间戳,您可以根据从 API 获得的最后一个值来检查它确保您实际上使用的是最新值。
关于asynchronous - 在回流中排队异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36940449/
不确定是否有解决此问题的方法。我想知道是否有一种方法可以检测浏览器何时实际更新用户界面。 假设我想在运行长时间运行的同步代码块之前向元素添加一个类,在同步函数运行之后,该类将被删除。 el.class
给定这段代码: $('#foo').css('height', '100px'); // or any other change to the DOM console.log('done!'); 当第
有没有办法全局 console.log() Reflux 中所有触发的 Action ?理想情况下同时打印它们的参数。 最佳答案 正如 Cory Danielson 所说,Reflux 使用 Even
出于某种原因,每次我在我的 React 组件中触发一个 Action 时,与该 Action 关联的存储方法都会触发两次。使用 Firefox 调试器,我注意到事件发射器似乎“发射”了两次 Actio
我正在处理一个包含用户可调整大小的列的网页,并且在调整列大小时遇到重排问题,这会导致元素在列变窄时被下推和不对齐。然而,谷歌文档似乎没有这个问题;您可以调整文档列表的大小,它会 chop 文本而不
好吧,我遇到了我认为是优化问题的问题。我写了一个简短的应用程序,它从两个字段中获取数据,逐个字符地将它们分开并将它们相互匹配,突出显示差异。问题似乎是因为函数循环并且不仅一次打印每个字符,而且一次一个
我在阅读两个 CSS 属性 display:none 和 visibility:hidden 之间的区别时遇到了 DOM reflow 术语。 声明是 display: none causes a D
页面呈现流程 在讨论页面重绘、回流之前。需要对页面的呈现流程有些了解,页面是怎么把html结合css等显示到浏览器上的,下面的流程图显示了浏览器对页面的呈现的处理流程。可能不同的浏览器略微会有些不
我经常读到在读取元素样式后更改样式是一种不好的做法,因为它会触发不必要的重排。考虑来自 here 的这段代码: 错误代码: elementA.className = "a-style"; var he
嗨,我有这个导航栏: text
有时我们必须强制浏览器重绘/回流以呈现某些状态。例如: window.onload = function () { setTimeout(function(){ document.getE
我是 JavaScript 和 D3 新手,我正在尝试修改 DOM 元素的某些属性,然后进行页面重排/刷新,以便我可以看到这些更新的更改。诀窍是,我需要这种情况自动发生,而不需要任何类型的 oncli
过去我在 javascript 方面做过很多工作,包括一些 DOM 操作。从那里我了解到回流/重绘在某些情况下可能是一个很大的性能问题,并且通常应该限制在最低限度。例如,当添加一组 div 时,您应该
我最近在我的项目中使用了回流,这是一个让我很困惑的问题。 作为回流模式,我在我的 React 组件中调用操作,并在我的回流存储中获取正在监听这些操作的远程数据。我的组件会监听存储中数据的变化。例如获取
tl;dr:每次我向其添加新图表时,GraphStore 的 UUID 都会发生变化。这让我假设每个图都在创建自己独特的 GraphStore。我希望他们都共享一个商店。 我有一个包含多个图形组件的
例如,如果我做类似的事情 requestAnimationFrame(function() { el.appendChild(otherEl) el.appendChild(anoth
是否可以在 RubyMine 3.2.4 中格式化或重新缩进 html?我尝试了 Code... Reformat Code 但它似乎对 HTML 没有任何作用。我需要插件吗? 最佳答案 它确实有效。
我想知道现代网络浏览器是否有一种可靠的方法来检测文档回流和/或重绘,或者是否有任何紧迫的兴趣可能将其放入 W3 规范。 我还想知道如何使用特定于 vendor 的技巧(例如,Mozilla 显然有一个
block 项的每个可视行的第一个元素是否有一个 CSS 选择器?也就是说,想象一下有 20 个 block 元素,它们跨多行流动以适应它们的父容器;我可以选择每行最左边的元素吗? 通过查看所有元素的
我正在构建一个 React+Reflux 应用程序,除其他外,它允许创建/删除/编辑类别。到目前为止,我能够显示所有类别并通过关联的存储和操作处理 React 组件内类别的创建/删除。这一切都很好,更
我是一名优秀的程序员,十分优秀!