Muitas APIs RESTful retornam códigos de status diferentes de 200 que devem ser considerados como success
– por exemplo, a 201 CREATED
. No entanto, o Backbone usa o ajax
método jQuery e isso tratará qualquer coisa que não seja um 200
código como um erro.
O ajax
método jQuery tem uma statusCode
propriedade que permite configurar uma instrução switch de respostas dependendo do código de status retornado. No entanto, mesmo se você definir isso para chamar o success
retorno de chamada em um código diferente de 200, o error
retorno de chamada ainda será chamado – o que pode causar problemas em muitos casos.
No entanto, usando um método semelhante ao discutido em Adicionar um URL raiz a todas as solicitações da API Backbone , podemos contornar este problema:
define(function () {
'use strict';
/*
* Store a version of Backbone.sync to call
* with modified options
*/
var backboneSync = Backbone.sync,
/**
* New error is a currying function. You pass in a method,
* success function, and error function and it returns a
* new error function that will call the success function if
* a 'sucess code' corresponds to the method.
*/
newError = function (method, success, error) {
// Each method can have its own specific success code
var successCodes = {
create: 201
};
// Return the original error function if no matching 'success code'
if (!successCodes[method]) {
return error;
}
return function (jqXHR, textStatus, errorThrown) {
// If the response is a success code
var wasSuccessful = jqXHR.status === successCodes[method],
response;
// If the status is a 'success code' run the success function
if (wasSuccessful && _.isFunction(success) ) {
// Set the response if there is one
response = jqXHR.responseJSON ? jqXHR.responseJSON : {};
// Call the success function
success(response, textStatus, jqXHR);
// Otherwise run the error as usual
} else if (_.isFunction(error)) {
// Call the original error function
error(jqXHR, textStatus, errorThrown);
}
};
};
// Override Backbone.sync
Backbone.sync = function (method, model, options) {
// Set options to error to the new error function
options.error = newError(method, success, error);
// Call the stored original Backbone.sync method with the new settings
backboneSync(method, model, options);
};
});
Este novo Backbone.sync
define o error
retorno de chamada para uma nova função que primeiro verifica o código de status de retorno e chama o success
retorno de chamada se for contado como bem-sucedido. Caso contrário, ele se comporta como teria originalmente. Agora podemos passar nossos retornos de costume error
e de success
chamada e não nos preocupar com o tratamento do código de status.