Объявляя обещание в angularJS с названными обратными вызовами успеха/ошибки
Я пытаюсь сделать что-то очень похожее на службу $http. Из моего понимания $http возвращает объект обещания.
При использовании синтаксиса:
$http(...).success(function(data)) {
//success callback
}).error(function(data)) {
//error callback
})
Я хотел бы сделать то же самое, но считаю, что мой API - это GetUserProfile, поэтому я хочу иметь синтаксис:
GetUserProfile(...).success(function(data) {
// success callback
}).error(function(data)) {
// error callback
})
как я могу выполнить это, используя обещание?
Ответы
Ответ 1
Хорошая вещь с открытым исходным кодом заключается в том, что вы можете прочитать источник. Вот как это делает служба $http:
promise.success = function(fn) {
promise.then(function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.error = function(fn) {
promise.then(null, function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
Ответ 2
Вам нужно использовать службу $q и создать и вернуть свое собственное обещание в GetUserProfile:
function GetUserProfile() {
var deferred = $q.defer();
var promise = deferred.promise;
// success condition
if (!true) {
deferred.resolve('data');
// error condition
} else {
deferred.reject('error');
}
promise.success = function(fn) {
promise.then(fn);
return promise;
}
promise.error = function(fn) {
promise.then(null, fn);
return promise;
}
return promise;
}
GetUserProfile()
.success(function(data) {
console.log(data);
})
.error(function(error) {
console.error(error);
});
Ответ 3
Вам не нужен исходный код изменения.
Angular предоставляют способ изменения любой службы в angular include $q.
$обеспечивает .decorator идеально подходит для вашего требования
вот мой код.
поместите его в app.module('...'). config
$provide.decorator('$q', function($delegate) {
function httpResponseWrapper(fn) {
return function(res) {
if (res.hasOwnProperty('data') && res.hasOwnProperty('status') && res.hasOwnProperty('headers') && res.hasOwnProperty('config') && res.hasOwnProperty('statusText')) {
return fn(res.data, res.status, res.headers, res.config, res.statusText);
} else {
return fn(res);
}
};
};
function decorator(promise) {
promise.success = function(fn) {
return decorator(promise.then(httpResponseWrapper(fn)));
};
promise.error = function(fn) {
return decorator(promise.then(null, httpResponseWrapper(fn)));
};
return promise;
};
var defer = $delegate.defer;
$delegate.defer = function() {
var deferred = defer();
decorator(deferred.promise);
return deferred;
};
return $delegate;
});