如何解决存储中操作之间的依赖关系
How to resolve dependency between actions within a Store
My Store注册了2种操作类型,如下所示:
Dispatcher.register(function (action) {
switch (action.type) {
case 'loadCar':
loadCar();
break;
case 'loadTyres':
loadTyres();
break;
}
})
我如何保证loadCar
在loadTyres
之前执行?有没有一种方法可以等待这个依赖的方法,而不必每次只想执行loadTyres
时都执行loadCar
?
下面是一个您可以尝试的未经测试的模式。您可能需要开始调度一个start loadcar
,例如loadcar completed
来完成此操作(请参阅此处)。
// pick your favorite Promise library
var Promise = require('bluebird');
Dispatcher.register(function (action) {
switch (action.type) {
case 'loadCar':
// need to be async here
loadCar(action.carId).then(function(car) {
// this eventually returns
});
break;
case 'loadTyres':
// need to be async here
loadTyres(action.carId).then(function(tyres) {
})
break;
}
})
您也可以保存Promise对象并缓存它,使其成为"当前"汽车,然后它就不会被重新装载(除非你把它从阵列中移除)。
var allCars = {};
function loadCar(id) {
if(typeof allCars[id] === 'undefined') {
allCars[id] = loadCarPromise(id);
}
return allCars[id];
}
您将创建一个返回Promise的函数,该函数将使用您正在加载的car
数据的细节进行解析。你需要做你通常在那里做的任何事情,但最终会调用resolve
或reject
回调来正确地继续Promise链。
function loadCarPromise(id) {
return new Promise(function(resolve, reject) {
// do whatever you do to get
// the car
// when it's done, call resolve
// or reject if there is a failure.
// ex:
$.ajax({
url: 'api/car/' + id,
success: function(data) {
resolve(data);
},
error: function(err) {
reject(err);
}
});
});
}
最后,loadTyres
将在内部使用loadCar
,并且仅在返回轮胎数据时自行解析。
function loadTyres(carId) {
// the car is always loaded first, then the tyres
// but if using the cache, the car will be
// returned immediately (although you won't need
// to worry about that)
return loadCar(carId).then(function(car) {
return new Promise(function(resolve, reject) {
// do something to load the tyres
// with the car info that was returned
resolve(/* tyres data */);
});
});
}
相关文章:
- 操作放置在画布上的元素之间的连接
- 在Google Analytics中跟踪用户,但只能在两个操作之间跟踪
- 如何解决存储中操作之间的依赖关系
- 在 Zend Framework 中的 AJAX 调用后在操作之间传递变量
- 如何在两个聚合之间进行操作
- 在不同的视图之间共享相同的操作/功能
- 弹出窗口和浏览器操作窗口之间的chrome.storage
- 在操作之间发送 Ajax 消息集超时 m 延迟
- 真实的用户操作和程序生成的操作之间有什么区别
- 如何在it块之间同步操作
- 数组之间操作中的语义含义
- chrome扩展的浏览器操作、后台脚本和内容脚本之间通信的上下文和方法
- 仅使用数学操作更改0->1或1->0之间的值
- 在表单操作与复选框或单选按钮之间交替进行
- Ajax和Ajax之间的区别是什么?调用返回JSON的操作方法时
- Redux在组件之间共享操作
- 如何使用导航器按钮执行页面之间导航以外的操作
- js按键事件和未发生按键事件时的操作之间的间隔
- 如何在我的 javascript 中延迟以下操作之间的执行
- 在相同函数的操作之间添加时间延迟