工厂内 AngularJS promises 的问题
Issue with AngularJS promises within a factory
我有一个这样的 angularjs 工厂:
'use strict';
angular.module('frontRplApp')
.factory('paymentService', function ($rootScope, $http, config, tools) {
var urlBase = config.baseUrl;
var paymentService = {
response: {},
create: function () {
var args = {};
return $http.post(urlBase + 'api/investor/payment/create', args);
}
});
我打算在这样的控制器中使用它(重要的问题是如果一切顺利或出现错误,则做一些不同的事情)
$scope.order = function () {
console.log('PaymentCashCtrl.order');
$scope.disabledButtons.submitCashOrder = true;
paymentService.create()
.then(
function (response) {
// do something with response
}, function (error) {
// do something with an error
}));
};
但是我的问题是,我想更新一些 paymentService 字段,因为 $http.post 的响应已解决,然后 return 承诺,以便功能(响应)和功能(错误)控制器中的回调继续工作。
我试过类似的东西:
return $http.post(urlBase + 'api/investor/payment/create', args)
.then(function(response){
console.log(response);
this.response = response;
return response;
});
但它不起作用,因为从未调用控制器中的函数(错误)处理程序。
我想在控制器中使用我的处理程序,但也想在 $http.post 响应得到解决时进行一些更新。
谢谢。
使用$q
将您的工厂代码更改为:
angular.module('frontRplApp')
.factory('paymentService', function ($rootScope, $http, config, tools, $q) {
var urlBase = config.baseUrl;
var paymentService = {
response: {},
create: function () {
var deferred = $q.defer();
var args = {};
$http.post(urlBase + 'api/investor/payment/create', args)
.then(function(response){
console.log(response);
paymentService.response = response;
deferred.resolve(response);
}, function (error) {
deferred.reject(error);
});
return deferred.promise;
}
};
return paymentService;
});
在工厂中,您需要 return 函数 paymentService
对象。另外,不要解决工厂内部的承诺。在控制器中解决。
.factory('paymentService', function($rootScope, $http, config, tools) {
var urlBase = config.baseUrl;
var paymentService = {
response: {},
create: function() {
var args = {};
return $http.post(urlBase + 'api/investor/payment/create', args);
}
}
return paymentService;
});
$scope.order = function() {
console.log('PaymentCashCtrl.order');
$scope.disabledButtons.submitCashOrder = true;
paymentService.create()
.then(
function(response) {
// do something with response
},
function(error) {
// do something with an error
}));
};
我有一个这样的 angularjs 工厂:
'use strict';
angular.module('frontRplApp')
.factory('paymentService', function ($rootScope, $http, config, tools) {
var urlBase = config.baseUrl;
var paymentService = {
response: {},
create: function () {
var args = {};
return $http.post(urlBase + 'api/investor/payment/create', args);
}
});
我打算在这样的控制器中使用它(重要的问题是如果一切顺利或出现错误,则做一些不同的事情)
$scope.order = function () {
console.log('PaymentCashCtrl.order');
$scope.disabledButtons.submitCashOrder = true;
paymentService.create()
.then(
function (response) {
// do something with response
}, function (error) {
// do something with an error
}));
};
但是我的问题是,我想更新一些 paymentService 字段,因为 $http.post 的响应已解决,然后 return 承诺,以便功能(响应)和功能(错误)控制器中的回调继续工作。
我试过类似的东西:
return $http.post(urlBase + 'api/investor/payment/create', args)
.then(function(response){
console.log(response);
this.response = response;
return response;
});
但它不起作用,因为从未调用控制器中的函数(错误)处理程序。
我想在控制器中使用我的处理程序,但也想在 $http.post 响应得到解决时进行一些更新。
谢谢。
使用$q
将您的工厂代码更改为:
angular.module('frontRplApp')
.factory('paymentService', function ($rootScope, $http, config, tools, $q) {
var urlBase = config.baseUrl;
var paymentService = {
response: {},
create: function () {
var deferred = $q.defer();
var args = {};
$http.post(urlBase + 'api/investor/payment/create', args)
.then(function(response){
console.log(response);
paymentService.response = response;
deferred.resolve(response);
}, function (error) {
deferred.reject(error);
});
return deferred.promise;
}
};
return paymentService;
});
在工厂中,您需要 return 函数 paymentService
对象。另外,不要解决工厂内部的承诺。在控制器中解决。
.factory('paymentService', function($rootScope, $http, config, tools) {
var urlBase = config.baseUrl;
var paymentService = {
response: {},
create: function() {
var args = {};
return $http.post(urlBase + 'api/investor/payment/create', args);
}
}
return paymentService;
});
$scope.order = function() {
console.log('PaymentCashCtrl.order');
$scope.disabledButtons.submitCashOrder = true;
paymentService.create()
.then(
function(response) {
// do something with response
},
function(error) {
// do something with an error
}));
};