我有一个工厂,它对我的salesforce apex类进行JavaScript远程处理并返回承诺。我正在多次同时调用工厂方法,这将为每次调用返回defer.promise。但不知怎的,它总是让我每次都先回电话。即使我在defer.resolve(响应)期间来自服务器的响应在工厂方法内是不同的,当返回defer.promise时,它每次都返回相同的结果给控制器。我试过调试但找不到任何成功。任何人都可以建议我做错了什么。
这是我的工厂方法:
app.factory('FieldSetFactory', ['$q', '$log', function($q, $log) {
var fieldSet = {};
var defer = $q.defer();
fieldSet.getFields = function(scope,fieldSetName, objectName) {
this.scope = scope;
var self = this;
FieldSetController.getFieldSetInfo(fieldSetName,objectName,function(response, event) {
if(event.status) {
console.log('response =',response); //this prints the actual result returned from server for different calls with different parameters
defer.resolve(response);
}
else {
$log.error(event.message);
defer.reject(event.message);
}
});
return defer.promise;
}
return fieldSet;
}]);
我将我的控制器名称保存为fieldSetJsController {!cid},其中{!cid}是唯一的并且由尝试使用它的任何组件传递。这是为了使控制器范围适用于单个调用而不是每次都覆盖它们,一些其他组件传递了一些数据。
app.controller('fieldSetJsController{!cid}', ['$scope', 'dataService',
'requestNotificationChannel','FieldSetFactory', function($scope,
dataService,
requestNotificationChannel,FieldSetFactory) {
FieldSetFactory.getFields($scope,$scope.fieldSetName,$scope.objectAPIName).then(function(response){
console.log("response in controller..............",response); //this response always shows reslut of first call and any subsequent calls return same defer.promise
$scope.fieldsetList = JSON.parse(response.replace(/&/g,'').replace(/quot;/g,'"'));
console.log("FiledSets..............",$scope.fieldsetList); //this is always printing same result for different calls with different parameter
});
}]);
这些是我的组件,它们使用不同的{!cid}值调用相同的控制器来区分它们。
<c:FieldSetComponent objectAPIName="Applications__c"
fieldSet="Application_FieldSet_One" cid="Applications_FieldSet_One"
sectionTitle="Section 1" columns="2" textAlign="center">
</c:FieldSetComponent>
<c:FieldSetComponent objectAPIName="Applications__c"
fieldSet="Application_FieldSet_Second" cid="Applications_FieldSet_Second"
sectionTitle="Section 2" columns="2" textAlign="center">
</c:FieldSetComponent>
<c:FieldSetComponent objectAPIName="clcommon__Collateral__c"
fieldSet="Collateral_FieldSet_One" cid="Collateral_FieldSet_One"
sectionTitle="Section 3" columns="2" textAlign="center">
</c:FieldSetComponent>
答案 0 :(得分:1)
问题在于:
var defer = $q.defer();
您在Factory的构造函数中生成延迟对象(而不是每次调用函数时都创建一个新对象),因此您的应用程序会一遍又一遍地解析相同的promise对象。
将var defer = $q.defer()
移到工厂方法内部,它应该可以正常工作。