breeze:默认错误处理程序

时间:2014-04-18 12:30:57

标签: breeze

有没有办法为使用breeze进行的所有调用提供默认错误处理程序?

现在我必须为breeze.EntityManager.fetchEntityByKey / breeze.EntityQuery.execute / breeze.EntityManager.saveChanges

返回的每个承诺添加.fail(onFail)

最好是为所有调用设置默认错误处理程序并覆盖特定调用的默认处理程序。

2 个答案:

答案 0 :(得分:2)

我开始留下一堆评论,并决定将其作为答案。您可以随时执行此操作以减少所需的代码并提高可重用性 -

var thisQuery = breeze.entityQuery.from('Whatever').where('pwkad', '==', 'awesome');
queryRunner(thisQuery);

function queryRunner(query) {
    query.execute().fail(queryFailed);
};

function queryFailed(error) {
    console.log(error.message);
};

使用'queryRunner'时,共享一个已定义的queryFailed方法。然后,您可以将所有与该类型无关的可重用代码放在那里。为了更进一步,你还可以构建一个基本查询,让所有其他查询'继承'(我使用它松散)到你使用参数构建查询的地方,然后只维护一个代码库。我强烈建议这样做(我在所有的Breeze.js制作应用程序中使用它),因为它会强制您遵循前端和API代码的约定。我不会泄露我的秘密调味品,但这是一个快速的例子 -

// All is pseudo code
function getEntityById (manager, type, resourcePath, forceRemote, idProp, idValue, params) {
    if (!manager) { throw "Must pass in a manager"; }

    var query = breeze.entityQuery.from(resourcePath).toType(type);

    if (!forceRemote) {
        // Put your code here to get from cache
        var entity = breeze.fetchEntityByKey();
        if (entity) {
            return entity;
        }
    }

    if (params) {
        // Pass in a valid params object and set it to whatever
        query.withParameters(params);
    }

    if (idValue && idProp) {
        query.where(idProp, '==', idValue);
    }

    query.execute().fail(queryFailed);

    function queryFailed(error) {
        console.log(error);
    }
}

可以通过Id -

从需要“获取”实体的任何地方调用
var manager = new breeze.entityManager();

var hamburger = getEntityById(manager, 'Hamburger', 'Hamburgers', true, 'id', 1);

使用此方法,您可以编写一个单一的微风查询,并从任何地方调用它,节省大量时间和调试,前提是您正确地提供参数。

答案 1 :(得分:2)

breeze允许在应用程序启动时设置错误处理程序:

var ajaxAdapter = breeze.config.getAdapterInstance("ajax");

ajaxAdapter.requestInterceptor = function (requestInfo) {
    // this method is called for every request made with breeze ajax adapter
    // all callbacks are in zConfig
    var
        successHandler = requestInfo.zConfig.success,
        errorHandler = requestInfo.zConfig.error || handleBadRequest,
        finalHandler = requestInfo.zConfig.finally; // final handler for calls, made directly with adapter

    if (finalHandler) {
        requestInfo.zConfig.success = function (response) {
            if(successHandler) {
                successHandler(response);
            }
            finalHandler(response);
        }
    }

    requestInfo.zConfig.error = function (response) {            
        switch (response.status) {
        case 400:
            // call error handler only for 'BadRequest'
            errorHandler(parseErrors(response));
            break;
        case 401:
            handleUnauthorizedRequest(response);
            break;
        default:
            handleServerOrUnrecognizedError(response);
            break;
        }
        if (finalHandler) {
            finalHandler(response);
        }
    };
};