Skip to content

Instantly share code, notes, and snippets.

@akre54
Last active November 22, 2023 19:10
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save akre54/9891fc85ff46afd85814 to your computer and use it in GitHub Desktop.
Save akre54/9891fc85ff46afd85814 to your computer and use it in GitHub Desktop.
Backbone.ajax with window.fetch
var defaults = function(obj, source) {
for (var prop in source) {
if (obj[prop] === undefined) obj[prop] = source[prop];
}
return obj;
}
var stringifyGETParams = function(url, data) {
var query = '';
for (var key in data) {
if (data[key] == null) continue;
query += '&'
+ encodeURIComponent(key) + '='
+ encodeURIComponent(data[key]);
}
if (query) url += (~url.indexOf('?') ? '&' : '?') + query.substring(1);
return url;
}
var status = function(response) {
if (response.status >= 200 && response.status < 300) {
return response;
}
throw new Error(response.statusText);
}
var json = function(response) {
return response.json()
}
Backbone.ajax = function(options) {
if (options.type === 'GET' && typeof options.data === 'object') {
options.url = stringifyGETParams(options.url, options.data);
}
return fetch(options.url, defaults(options, {
method: options.type,
headers: defaults(options.headers || {}, {
'Accept': 'application/json',
'Content-Type': 'application/json'
}),
body: options.data
}))
.then(status)
.then(json)
.then(options.success)
.catch(options.error);
};
@RobertCZ
Copy link

Do I understand correctly - with this plugin BB.ajax-returned promise is never rejected because the last line will not re-throw any error?

@akre54
Copy link
Author

akre54 commented Sep 4, 2015

Right, you could just kill that line if you don't need options.error or rethrow/Promise.reject() yourself in the catch if you do. This is mostly for demo, you might want to add your own logic in your app.

@cmmartin
Copy link

Pretty simple change to keep the promises alive and kickin...

.then(function (result) {
  options.success.apply(this, arguments);
  return result;
})
.catch(function (err) {
  options.error.apply(this, arguments);
  throw err;
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment