gpt4 book ai didi

javascript - AngularJS 中的 promise 错误

转载 作者:行者123 更新时间:2023-12-02 16:29:48 25 4
gpt4 key购买 nike

我使用 Promise 从服务中的 json 获取数据,然后将其传递到我的 Controller 。我在这方面遇到了一些问题。

这就是我的服务

getMetaData: function () {
var defer = this.$q.defer();
this.$http.get('http://localhost:8084/login-api/public/metadata/describe/Coisa')
.success(function (data, status, headers, config) {
defer.resolve(data)
})
.error(function (data, status, headers, config) {
defer.reject(status);
})
return defer.promise;

}

在这里,我在我的 Controller 中调用服务

getData: function () {
this.$scope.meta = this.EntityService.getMetaData();
var dataS = {};
this.$scope.meta.then(
function (data) {
this.$scope.metaD = data;
},
function (err) {
alert('Error');
}
)
}

这是我遇到的错误:

TypeError: Cannot set property 'metaD' of undefined
at basic-list-controller.js:29
at l.promise.then.l (angular.js:7)
at angular.js:7
at u.$get.u.$eval (angular.js:7)
at u.$get.u.$digest (angular.js:7)
at u.$get.u.$apply (angular.js:7)
at p (angular.js:7)
at T (angular.js:7)
at XMLHttpRequest.b.onreadystatechange (angular.js:7)

我不明白为什么会出现这个错误。当我在控制台上记录数据时,它就在那里,但我无法将值赋予变量。

最佳答案

您的处理方式存在很多问题。

首先:对于已经返回 promise 的内容,您不需要使用 $q.defer ,例如 $http - 这被认为是 deferred anti-pattern .

第二:避免将 $scope 传递给您的服务 - 它会使测试变得更加困难并且会扰乱关注点分离。 $scope 属于 Controller 。

因此,您的服务可以变得更加简单。您甚至不需要两种方法 - 因为它们都返回相同的内容

.factory("myDataService", function($http){
return {
getMetaData: function(){
return $http.get('url/to/data');
}
};
}


.controller("MainCtrl", function($scope, myDataService){
myDataService.getMetaData()
.then(function(data)){
$scope.metaD = data;
});
}

关于javascript - AngularJS 中的 promise 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28412530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com