【问题标题】:Can I resolve a promise from a broadcasted event?我可以解决广播事件中的承诺吗?
【发布时间】:2017-07-11 08:54:10
【问题描述】:

我们正在使用 Angular legacy (1.5) 我正在尝试使用 3rd 方库批量加载一些图层。 我需要等到它们被加载后再继续。 因此,在我的获取数据部分,它调用库并要求它添加数据,我在此部分中启动 $q.defer 并将其分配给工厂级变量。 在第 3 方库的服务中,我设置了请求出和请求的计数,当它们匹配时,$broadcast 和事件告诉我它完成了。 然后我监听 ($on) 这个事件并将承诺设置为已解决。 但是应用程序不会等待这个。 我知道这很奇怪,但我能做什么。

我们的代码非常复杂,所以我尝试创建粗略的示例来说明我们试图归档的内容。

function layerFactory($rootScope, $log, $q, DataService) {
    var factory = {
        getData:getData,              
        var _dataPromise;
        function getData(data){
             _getLayerData(data).then(function(){
                 _processData(data);
             });                 
        }  
        function _getLayerData(data){
             _dataPromise = $q.defer();
             DataService.getData(data) // Treat DataService as a 3rd party lib, this doesn't return a promise.  I have no way of knowing this is complete until a $broadcast is sent.
             _dataPromise.promise;
        }

        $rootScope.$on('dataLoaded', function(){
            _dataPromise = $q.resolve();
        });
}
    return factory;
}

这不是等待承诺解决,而是进入“then”语句并“过早”处理下一个函数,我需要它等到第一个函数完成。

有什么想法吗?

【问题讨论】:

    标签: javascript angularjs angular-promise angular-broadcast


    【解决方案1】:

    好的,我找不到让这个工作的方法,所以我所做的是设置一个工厂级变量(布尔值)来指示加载何时开始,然后在 $on 时将其设置为 false事件被触发。 在我的 getLayerData 方法中,我设置了一个内部以每 500 毫秒运行一次,在此间隔函数中,我检查加载变量,如果为 false(即已加载),则返回 deferred.resolve() 并取消间隔。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 2020-07-13
      • 1970-01-01
      • 2021-10-01
      • 2015-02-07
      相关资源
      最近更新 更多