回报承诺的承诺

时间:2015-04-01 06:46:32

标签: javascript jquery angularjs

我对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

2 个答案:

答案 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函数中返回值或承诺。当你回复承诺。该承诺解决后,将返回该承诺的解决价值