Javascript AngularJS-无法获得$q.reject并开始工作
看看我的代码示例: 我已经把它精简到(我认为是)最基本的部分,我正在设置一个错误Javascript AngularJS-无法获得$q.reject并开始工作,javascript,ajax,angularjs,promise,angular-promise,Javascript,Ajax,Angularjs,Promise,Angular Promise,看看我的代码示例: 我已经把它精简到(我认为是)最基本的部分,我正在设置一个错误延迟。拒绝不是一个函数 angular .module('myApp') .service('myService', MyService); MyService.$inject = ['$http', '$q']; function MyService($http, $q) { var self = this; self.getResult = getResult; f
延迟。拒绝不是一个函数
angular
.module('myApp')
.service('myService', MyService);
MyService.$inject = ['$http', '$q'];
function MyService($http, $q) {
var self = this;
self.getResult = getResult;
function getResult(id) {
var deferred = $q.defer();
deferred = $http.get('my/api/method', { params: { id: id } })
.then(getResultCompleted)
.catch(getResultFailed);
function getResultCompleted(response) {
if (response.data.ID > 0) {
deferred.resolve(response.data);
} else {
deferred.reject(response);
}
}
function getResultFailed(response) {
deferred.reject(response);
}
return deferred.promise;
}
}
注意:我知道我可以通过简单地返回$http调用的结果来实现这一点,但是为了理解这些promise对象,我想看看是否可以通过如上所示声明并返回deferred
来实现这一点
谢谢 您正在创建自定义承诺并从您的方法返回它,但这意味着在处理它时,您正在使用
$http.get
覆盖延迟的(自定义承诺对象),该方法还返回具有的承诺。然后
和.catch
方法(没有resolve
和reject
方法)。由于该赋值,您无法从延迟的对象访问.resolve
和.reject
deferred = $http.get('my/api/method', { params: { id: id } })
应该只有
$http.get('my/api/method', { params: { id: id } })
由于$http.get()
返回承诺且成功回调支持链接API,因此您可以在回调中定义新的延迟对象并从中返回:
angular
.module('myApp')
.service('myService', MyService);
MyService.$inject = ['$http', '$q'];
function MyService($http, $q) {
var self = this;
self.getResult = getResult;
function getResultCompleted(response) { // Tip: Define callback outside of getResult in order to avoid creating new instance of it each time getResult is called
var deferred = $q.defer();
if (response.data.ID > 0) {
deferred.resolve(response.data);
} else {
deferred.reject(response);
}
return deferred.promise;
}
function getResult(id) {
return $http.get('my/api/method', { params: { id: id } })
.then(getResultCompleted);
}
}
注意,不再有错误回调(只是因为在本例中它是冗余的)
如果请求失败,将返回来自$http.get()
的原始拒绝承诺,否则将使用来自success回调的全新承诺进行后续.then()
调用。$http.get()
返回承诺,但不返回deferred@Vadim:我不明白。你能帮我翻译一下吗?我指的是deferred=$http.get()
string。这是不正确的,因为$http.get()
返回的不是延迟对象,而是promise。因此,您可以只返回$http.get
谢谢@PankajParkar。我还是有点不清楚。如果给它赋值$http.get的返回结果,这是否意味着它接受了值?@Ricky不……promise不是这样工作的。promise的意思是你说的,我是说的有东西要返回&过一段时间我会得到它..这就是为什么您创建了var deferred=$q.defer();
并且当您收到一个响应时,您使用数据resolve
,reject
和相同的数据..如果您这样做deferred=$http.get('my/api/method',{params:{id:id})
在它之间..它将刷新整个对象传统的$http.get
promise对象将引入其中..谢谢@Vadim.延迟的赌注将在哪里声明?我在您的代码中没有看到它(尽管可能我错过了它)@瓦迪姆:我不明白你为什么在返回$http.get
promise时使用延迟的对象already@PankajParkar一旦承诺得到解决,您就不能再拒绝它了。由于$http
中的原始承诺已经得到解决,并且您需要在特定条件下拒绝它,因此您需要创建new promise,为此您需要新的延迟。@Vadim您确定吗?这不像您在思考,因为您返回了像return$http.get('my/api/method',{params:{id:id}})这样的承诺
行,应该是延迟返回。承诺
成功working@PankajParkar看看这个plunk:。要了解它是如何工作的,您可以使用$http.get()的URL