2
0
mirror of https://github.com/tenrok/axios.git synced 2026-06-20 20:00:40 +03:00

Merge pull request #372 from rubennorte/promise-adapters

Changing adapter signature to receive config and return promises
This commit is contained in:
Matt Zabriskie
2016-07-13 12:58:30 -06:00
committed by GitHub
6 changed files with 311 additions and 339 deletions
+2 -2
View File
@@ -247,8 +247,8 @@ These are the available config options for making requests. Only the `url` is re
withCredentials: false, // default withCredentials: false, // default
// `adapter` allows custom handling of requests which makes testing easier. // `adapter` allows custom handling of requests which makes testing easier.
// Call `resolve` or `reject` and supply a valid response (see [response docs](#response-api)). // Return a promise and supply a valid response (see [response docs](#response-api)).
adapter: function (resolve, reject, config) { adapter: function (config) {
/* ... */ /* ... */
}, },
+5 -2
View File
@@ -1,13 +1,13 @@
# axios // adapters # axios // adapters
The modules under `adapters/` are modules that handle dispatching a request and settling a `Promise` once a response is received. The modules under `adapters/` are modules that handle dispatching a request and settling a returned `Promise` once a response is received.
## Example ## Example
```js ```js
var settle = require('./../core/settle'); var settle = require('./../core/settle');
module.exports myAdapter(resolve, reject, config) { module.exports myAdapter(config) {
// At this point: // At this point:
// - config has been merged with defaults // - config has been merged with defaults
// - request transformers have already run // - request transformers have already run
@@ -16,6 +16,8 @@ module.exports myAdapter(resolve, reject, config) {
// Make the request using config provided // Make the request using config provided
// Upon response settle the Promise // Upon response settle the Promise
return new Promise(function(resolve, reject) {
var response = { var response = {
data: responseData, data: responseData,
status: request.status, status: request.status,
@@ -30,5 +32,6 @@ module.exports myAdapter(resolve, reject, config) {
// From here: // From here:
// - response transformers will run // - response transformers will run
// - response interceptors will run // - response interceptors will run
});
} }
``` ```
+3 -1
View File
@@ -15,7 +15,8 @@ var createError = require('../core/createError');
var enhanceError = require('../core/enhanceError'); var enhanceError = require('../core/enhanceError');
/*eslint consistent-return:0*/ /*eslint consistent-return:0*/
module.exports = function httpAdapter(resolve, reject, config) { module.exports = function httpAdapter(config) {
return new Promise(function dispatchHttpRequest(resolve, reject) {
var data = config.data; var data = config.data;
var headers = config.headers; var headers = config.headers;
var timer; var timer;
@@ -169,4 +170,5 @@ module.exports = function httpAdapter(resolve, reject, config) {
} else { } else {
req.end(data); req.end(data);
} }
});
}; };
+3 -1
View File
@@ -8,7 +8,8 @@ var isURLSameOrigin = require('./../helpers/isURLSameOrigin');
var createError = require('../core/createError'); var createError = require('../core/createError');
var btoa = (typeof window !== 'undefined' && window.btoa) || require('./../helpers/btoa'); var btoa = (typeof window !== 'undefined' && window.btoa) || require('./../helpers/btoa');
module.exports = function xhrAdapter(resolve, reject, config) { module.exports = function xhrAdapter(config) {
return new Promise(function dispatchXhrRequest(resolve, reject) {
var requestData = config.data; var requestData = config.data;
var requestHeaders = config.headers; var requestHeaders = config.headers;
@@ -155,4 +156,5 @@ module.exports = function xhrAdapter(resolve, reject, config) {
// Send the request // Send the request
request.send(requestData); request.send(requestData);
});
}; };
+4 -10
View File
@@ -2,7 +2,6 @@
var utils = require('./../utils'); var utils = require('./../utils');
var transformData = require('./transformData'); var transformData = require('./transformData');
var enhanceError = require('./enhanceError');
/** /**
* Dispatch a request to the server using whichever adapter * Dispatch a request to the server using whichever adapter
@@ -36,8 +35,6 @@ module.exports = function dispatchRequest(config) {
} }
); );
return new Promise(function executor(resolve, reject) {
try {
var adapter; var adapter;
if (typeof config.adapter === 'function') { if (typeof config.adapter === 'function') {
@@ -51,13 +48,10 @@ module.exports = function dispatchRequest(config) {
adapter = require('../adapters/http'); adapter = require('../adapters/http');
} }
if (typeof adapter === 'function') { return Promise.resolve(config)
adapter(resolve, reject, config); // Wrap synchronous adapter errors and pass configuration
} .then(adapter)
} catch (e) { .then(function onFulfilled(response) {
reject(enhanceError(e, config));
}
}).then(function onFulfilled(response) {
// Transform response data // Transform response data
response.data = transformData( response.data = transformData(
response.data, response.data,
-29
View File
@@ -36,35 +36,6 @@ describe('requests', function () {
}); });
}); });
it('should reject on adapter errors', function (done) {
// disable jasmine.Ajax since we're hitting a non-existant server anyway
jasmine.Ajax.uninstall();
var resolveSpy = jasmine.createSpy('resolve');
var rejectSpy = jasmine.createSpy('reject');
var adapterError = new Error('adapter error');
var adapterThatFails = function () {
throw adapterError;
};
var finish = function () {
expect(resolveSpy).not.toHaveBeenCalled();
expect(rejectSpy).toHaveBeenCalled();
var reason = rejectSpy.calls.first().args[0];
expect(reason).toBe(adapterError);
expect(reason.config.method).toBe('get');
expect(reason.config.url).toBe('/foo');
done();
};
axios('/foo', {
adapter: adapterThatFails
}).then(resolveSpy, rejectSpy)
.then(finish, finish);
});
it('should reject on network errors', function (done) { it('should reject on network errors', function (done) {
// disable jasmine.Ajax since we're hitting a non-existant server anyway // disable jasmine.Ajax since we're hitting a non-existant server anyway
jasmine.Ajax.uninstall(); jasmine.Ajax.uninstall();