在辅助工厂中使用 AngularJS $q promises
Using AngularJS $q promises in helper factory
我正在努力思考何时在 AngularJS 中使用 $q
。到目前为止,我一直在我的所有服务中使用它,所以当我调用我们的 Web API 时,它运行良好。我想做的是减少对 API 的所有调用,因为我需要在多个地方使用相同的数据,而且每次需要数据时我都在 ping API。
现在我有一个服务,它获取数据和一个帮助文件来帮助处理与数据相关的事情。
我想要的是使用这个助手 factory
来保存每个使用它的主体所需的数据。
如果在 AngularJS 运行时数据还没有返回给我,我无法集中精力分配辅助文件中的数据值。
这是我目前所拥有的。
(function() {
var app = angular.module("Test", []);
app.service("githubService", function($http, $q) {
var deferred = $q.defer();
this.getAccount = function() {
return $http.get('https://api.github.com/users/JonDoe');
};
});
app.factory("githubHelper", ["githubService", function(githubService) {
_gitHubInfo = {};
githubService.getAccount().then(function(data) {
_gitHubInfo = data;
});
return {
gitHubInfo: _gitHubInfo
};
}]);
app.controller("Dummy", ["$scope", "githubHelper", "githubService", function($scope, githubHelper, githubService) {
// How do I make it work this way?
$scope.value = githubHelper.gitHubInfo;
// This is what I'm using now
githubService.getAccount().then(function(data) {
$scope.value2 = data;
});
}]);
})();
.box {
border: 1px red solid;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app="Test">
<div ng-controller="Dummy">
<div class="box">
{{value}}
</div>
<br />
<div class="box">
{{value2}}
</div>
</div>
</div>
我想做的只是从 Dummy
控制器中删除 githubService
依赖项,并且仅将其存在于 githubHelper
工厂中,这样我就可以删除对 githubService
来自我所有的控制器,而是使用 gitHubHelper
.
我需要在 Dummy
控制器中更改什么才能使 $scope.value
成为从 githubService.getAccount()
返回的数据?
您快了。问题是 githubinfo
在您访问它之前不会被填充。你应该做的几乎完全是(见我上面的评论)你正在做的 githubservice.getaccount
,但在 githubhelper.getaccount
中。将 githubinfo
设置为 $q.deferred
、return githubinfo.promise
from getaccount,并解决 then
中的承诺
更新:现在有更多代码! (现在我不在手机上了:-D)
(function() {
var app = angular.module("Test", []);
app.service("githubService", function($http, $q) {
this.getAccount = function() {
return $http.get('https://api.github.com/users/JonDoe');
};
});
app.factory("githubHelper", ["githubService", function(githubService) {
return {
gitHubInfo: $q(function(resolve, reject) {
githubService.getAccount().then(function(data) {
resolve(data);
}, reject);
}
};
}]);
app.controller("Dummy", ["$scope", "githubHelper",
function($scope, githubHelper) {
githubHelper.gitHubInfo.then(function(data) {
$scope.value = data;
});
}]);
})();
现在,按原样编写我永远不会批准它作为 PR,原因有很多(代码清晰度回复:return { someProp: function() { /* a bunch of code */} }
.... 应不惜一切代价避免使用 $scope
。 .. 如前所述,$cacheFactory
可以而且应该处理这个问题),但您应该能够大致了解这些方面的内容 可以 工作
我的项目中有这样的东西:
app.factory("githubHelper", ["githubService", function(githubService) {
var promise = null;
function getInfo() {
if (!promise) {
promise = githubService.getAccount();
}
return promise;
}
return {
getInfo: getInfo
};
}]);
githubHelper.getInfo().then(function(data) {})
githubHelper.getInfo().then(function(data) {})
githubHelper.getInfo().then(function(data) {})
...
我正在努力思考何时在 AngularJS 中使用 $q
。到目前为止,我一直在我的所有服务中使用它,所以当我调用我们的 Web API 时,它运行良好。我想做的是减少对 API 的所有调用,因为我需要在多个地方使用相同的数据,而且每次需要数据时我都在 ping API。
现在我有一个服务,它获取数据和一个帮助文件来帮助处理与数据相关的事情。
我想要的是使用这个助手 factory
来保存每个使用它的主体所需的数据。
如果在 AngularJS 运行时数据还没有返回给我,我无法集中精力分配辅助文件中的数据值。
这是我目前所拥有的。
(function() {
var app = angular.module("Test", []);
app.service("githubService", function($http, $q) {
var deferred = $q.defer();
this.getAccount = function() {
return $http.get('https://api.github.com/users/JonDoe');
};
});
app.factory("githubHelper", ["githubService", function(githubService) {
_gitHubInfo = {};
githubService.getAccount().then(function(data) {
_gitHubInfo = data;
});
return {
gitHubInfo: _gitHubInfo
};
}]);
app.controller("Dummy", ["$scope", "githubHelper", "githubService", function($scope, githubHelper, githubService) {
// How do I make it work this way?
$scope.value = githubHelper.gitHubInfo;
// This is what I'm using now
githubService.getAccount().then(function(data) {
$scope.value2 = data;
});
}]);
})();
.box {
border: 1px red solid;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app="Test">
<div ng-controller="Dummy">
<div class="box">
{{value}}
</div>
<br />
<div class="box">
{{value2}}
</div>
</div>
</div>
我想做的只是从 Dummy
控制器中删除 githubService
依赖项,并且仅将其存在于 githubHelper
工厂中,这样我就可以删除对 githubService
来自我所有的控制器,而是使用 gitHubHelper
.
我需要在 Dummy
控制器中更改什么才能使 $scope.value
成为从 githubService.getAccount()
返回的数据?
您快了。问题是 githubinfo
在您访问它之前不会被填充。你应该做的几乎完全是(见我上面的评论)你正在做的 githubservice.getaccount
,但在 githubhelper.getaccount
中。将 githubinfo
设置为 $q.deferred
、return githubinfo.promise
from getaccount,并解决 then
更新:现在有更多代码! (现在我不在手机上了:-D)
(function() {
var app = angular.module("Test", []);
app.service("githubService", function($http, $q) {
this.getAccount = function() {
return $http.get('https://api.github.com/users/JonDoe');
};
});
app.factory("githubHelper", ["githubService", function(githubService) {
return {
gitHubInfo: $q(function(resolve, reject) {
githubService.getAccount().then(function(data) {
resolve(data);
}, reject);
}
};
}]);
app.controller("Dummy", ["$scope", "githubHelper",
function($scope, githubHelper) {
githubHelper.gitHubInfo.then(function(data) {
$scope.value = data;
});
}]);
})();
现在,按原样编写我永远不会批准它作为 PR,原因有很多(代码清晰度回复:return { someProp: function() { /* a bunch of code */} }
.... 应不惜一切代价避免使用 $scope
。 .. 如前所述,$cacheFactory
可以而且应该处理这个问题),但您应该能够大致了解这些方面的内容 可以 工作
我的项目中有这样的东西:
app.factory("githubHelper", ["githubService", function(githubService) {
var promise = null;
function getInfo() {
if (!promise) {
promise = githubService.getAccount();
}
return promise;
}
return {
getInfo: getInfo
};
}]);
githubHelper.getInfo().then(function(data) {})
githubHelper.getInfo().then(function(data) {})
githubHelper.getInfo().then(function(data) {})
...