deferr.promise为angularJS中不同数据输入的同时调用返回相同的结果
defer.promise returning same result for simultaneous calls with different data inputs in angularJS
我有一个工厂,它对我的salesforce apex类进行JavaScript远程处理并返回promise。我同时多次调用工厂方法,每次调用都会返回defer.promise。但不知怎么的,它每次都会给我回第一个电话的结果。尽管在defer.resolve(response)过程中,来自服务器的响应在工厂方法内部是不同的,但当返回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},其中{!acid}是唯一的,并且由任何试图使用它的组件传递。这是为了使控制器的作用域为单独的调用,而不是每次都覆盖相同的调用,其他组件传递一些数据。
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>
问题就在这里:
var defer = $q.defer();
您正在Factory的构造函数中生成延迟对象(而不是每次调用函数时都创建一个新对象),因此您的应用程序正在反复解析同一个promise对象。
将var defer = $q.defer()
移动到工厂内部的方法,它应该可以正常工作。
相关文章:
- 如何从ajax调用返回.wrap()元素
- Ajax调用返回当前html页面,而不是请求的文件
- 如何在模式框中显示ajax调用返回的数据
- AngularJS$http.post调用返回502(坏网关)错误
- 有没有更好的方法可以测量从Ajax调用返回数据所需的总时间
- 格式化AJax调用返回的Json,并将其分配给javascript变量
- calling.trigger(“click”),它在ajax调用返回的javascript代码中
- 在异步调用返回之前隐藏页面
- 对php文件的Ajax调用返回该文件中的JS代码,而不是执行它
- 如何在下一次 AJAX 调用中访问从一个 AJAX 调用返回的变量
- jQuery 延迟的 AJAX 调用返回值
- Django Ajax 调用返回 403 错误请求
- 从异步调用返回数组,然后为数组的每个元素返回其他异步调用
- 从函数返回函数而不调用返回的函数
- 当Json Length过长时,对ASP.NET MVC Controller的Ajax调用返回404
- 如何从jQuery中Ajax调用返回的数据中获取对象
- 如果statusCode不是200,那么从http调用返回什么类型的错误对象
- 如何使用jsonp调用返回的数据在Durandal中呈现视图
- 为什么我的ajax调用返回null
- 如何获取ajax调用返回的元素数