我对Angular很新,但我试图找出一些东西。
我确实有一个返回承诺的方法:
preloaderServiceObject.Load = function(referencePaths){
var deferred = $q.defer();
$(referencePaths).each(function(index, referencePath) {
var preloadedElement = document.createElement('img');
{
preloadedElement.onload = deferred.resolve;
preloadedElement.src = referencePath;
}
});
return deferred.promise;
}
这一切都很好,并没有引起问题。 但是,我确实有另一种方法应该在promise的完成调用中返回一个promise,如下所示:
OfficeUIRibbonControlServiceObject.Initialize = function(configurationFile) {
$http.get(configurationFile)
.then(function (response) {
$rootScope.Tabs = response.data.Tabs;
$rootScope.ContextualGroups = response.data.ContextualGroups;
var images = JSPath.apply('.Groups.Areas.Actions.Resource', $rootScope.Tabs);
images.concat(JSPath.apply('.Tabs.Groups.Areas.Actions.Resource', $rootScope.ContextualGroups));
PreloaderService.Load(images);
});
}
最后一行PreloaderService.Load(images);
会返回此帖子中第一个函数中定义的承诺。
但是,现在我想调用方法`OfficeUIRibbonControlServiceObject.Initialize',但是我应该如何更改此方法以便我可以等到PreloaderService的加载完成之后呢?
只是更改方法以返回该promise将不起作用,因为返回的对象将是未定义的(因为我在$ http的then
方法中。
亲切的问候,
编辑:正如Rouby所建议的,使用承诺:
初始化功能:
OfficeUIRibbonControlServiceObject.Initialize = function(configurationFile) {
$http.get(configurationFile)
.then(function (response) {
$rootScope.Tabs = response.data.Tabs;
$rootScope.ContextualGroups = response.data.ContextualGroups;
var images = JSPath.apply('.Groups.Areas.Actions.Resource', $rootScope.Tabs);
images.concat(JSPath.apply('.Tabs.Groups.Areas.Actions.Resource', $rootScope.ContextualGroups));
var deferred = $q.defer();
PreloaderService.Load(images).then(function() {
deferred.resolve();
});
return deferred;
});
}
InitializeService方法:
function InitializeService(serviceInstance, configurationFile) {
serviceInstance.Initialize(configurationFile).then(function() {
console.log('This method has been called.');
});
}
结果是我得到:Error: serviceInstance.Initialize(...) is undefined
答案 0 :(得分:0)
在.Initialize
中创建一个新的延迟,在第二个.Load
完成时解析,然后您可以正常返回此延迟。
E.g。
PreloaderService.Load(images).then(function(){ newDeferred.resolve(); }, function(){ newDeferred.reject(); });
答案 1 :(得分:0)
更好地回报承诺:
OfficeUIRibbonControlServiceObject.Initialize = function(configurationFile) {
return $http.get(configurationFile)
.then(function (response) {
$rootScope.Tabs = response.data.Tabs;
$rootScope.ContextualGroups = response.data.ContextualGroups;
var images = JSPath.apply('.Groups.Areas.Actions.Resource', $rootScope.Tabs);
images.concat(JSPath.apply('.Tabs.Groups.Areas.Actions.Resource', $rootScope.ContextualGroups));
return PreloaderService.Load(images);
});
}
现在调用OfficeUIRibbonControlServiceObject.Initialize
函数时,将返回PreloaderService.Load
的结果。
示例:
OfficeUIRibbonControlServiceObject.Initialize(// myConfiguration //).then (
function success (response) {
console.log("promise success", response)
},
function fail (error) {
console.log("promise fail", error) // the result from PreloaderService.Load
}
);
一般情况下:您可以在.then
函数中返回值或承诺。当你回复承诺。该承诺解决后,将返回该承诺的解决价值