Lidando com códigos de status diferentes de 200 no Backbone

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 ajaxmétodo jQuery e isso tratará qualquer coisa que não seja um 200código como um erro.

O ajaxmétodo jQuery tem uma statusCodepropriedade 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 successretorno de chamada em um código diferente de 200, o errorretorno 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.syncdefine o errorretorno de chamada para uma nova função que primeiro verifica o código de status de retorno e chama o successretorno de chamada se for contado como bem-sucedido. Caso contrário, ele se comporta como teria originalmente. Agora podemos passar nossos retornos de costume errore de successchamada e não nos preocupar com o tratamento do código de status.