如何解决存储中操作之间的依赖关系

How to resolve dependency between actions within a Store

本文关键字:之间 操作 依赖 关系 存储 何解决 解决      更新时间:2024-02-29

My Store注册了2种操作类型,如下所示:

Dispatcher.register(function (action) {
    switch (action.type) {
        case 'loadCar':
            loadCar();
            break;
        case 'loadTyres':
            loadTyres();
            break;
    }
})

我如何保证loadCarloadTyres之前执行?有没有一种方法可以等待这个依赖的方法,而不必每次只想执行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数据的细节进行解析。你需要做你通常在那里做的任何事情,但最终会调用resolvereject回调来正确地继续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 */);          
        });
    });
}