mirror of
https://github.com/tenrok/axios.git
synced 2026-06-23 20:40: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:
@@ -247,8 +247,8 @@ These are the available config options for making requests. Only the `url` is re
|
||||
withCredentials: false, // default
|
||||
|
||||
// `adapter` allows custom handling of requests which makes testing easier.
|
||||
// Call `resolve` or `reject` and supply a valid response (see [response docs](#response-api)).
|
||||
adapter: function (resolve, reject, config) {
|
||||
// Return a promise and supply a valid response (see [response docs](#response-api)).
|
||||
adapter: function (config) {
|
||||
/* ... */
|
||||
},
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# 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
|
||||
|
||||
```js
|
||||
var settle = require('./../core/settle');
|
||||
|
||||
module.exports myAdapter(resolve, reject, config) {
|
||||
module.exports myAdapter(config) {
|
||||
// At this point:
|
||||
// - config has been merged with defaults
|
||||
// - request transformers have already run
|
||||
@@ -16,6 +16,8 @@ module.exports myAdapter(resolve, reject, config) {
|
||||
// Make the request using config provided
|
||||
// Upon response settle the Promise
|
||||
|
||||
return new Promise(function(resolve, reject) {
|
||||
|
||||
var response = {
|
||||
data: responseData,
|
||||
status: request.status,
|
||||
@@ -30,5 +32,6 @@ module.exports myAdapter(resolve, reject, config) {
|
||||
// From here:
|
||||
// - response transformers will run
|
||||
// - response interceptors will run
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
@@ -15,7 +15,8 @@ var createError = require('../core/createError');
|
||||
var enhanceError = require('../core/enhanceError');
|
||||
|
||||
/*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 headers = config.headers;
|
||||
var timer;
|
||||
@@ -169,4 +170,5 @@ module.exports = function httpAdapter(resolve, reject, config) {
|
||||
} else {
|
||||
req.end(data);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
+3
-1
@@ -8,7 +8,8 @@ var isURLSameOrigin = require('./../helpers/isURLSameOrigin');
|
||||
var createError = require('../core/createError');
|
||||
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 requestHeaders = config.headers;
|
||||
|
||||
@@ -155,4 +156,5 @@ module.exports = function xhrAdapter(resolve, reject, config) {
|
||||
|
||||
// Send the request
|
||||
request.send(requestData);
|
||||
});
|
||||
};
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
var utils = require('./../utils');
|
||||
var transformData = require('./transformData');
|
||||
var enhanceError = require('./enhanceError');
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
if (typeof config.adapter === 'function') {
|
||||
@@ -51,13 +48,10 @@ module.exports = function dispatchRequest(config) {
|
||||
adapter = require('../adapters/http');
|
||||
}
|
||||
|
||||
if (typeof adapter === 'function') {
|
||||
adapter(resolve, reject, config);
|
||||
}
|
||||
} catch (e) {
|
||||
reject(enhanceError(e, config));
|
||||
}
|
||||
}).then(function onFulfilled(response) {
|
||||
return Promise.resolve(config)
|
||||
// Wrap synchronous adapter errors and pass configuration
|
||||
.then(adapter)
|
||||
.then(function onFulfilled(response) {
|
||||
// Transform response data
|
||||
response.data = transformData(
|
||||
response.data,
|
||||
|
||||
@@ -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) {
|
||||
// disable jasmine.Ajax since we're hitting a non-existant server anyway
|
||||
jasmine.Ajax.uninstall();
|
||||
|
||||
Reference in New Issue
Block a user