【问题标题】:Share data from promise with callback of other controller与其他控制器的回调共享来自 Promise 的数据
【发布时间】:2015-04-29 20:55:29
【问题描述】:

控制器 A 通过 Promise 发送请求。在另一个控制器 B 中同时运行回调函数的最佳方法是什么?在原始回调中通过服务广播并在另一个控制器中监听它。是否有可能将承诺传递给控制器​​ B?

选项 1:

// controller A
service.doAjax().then( function( data ) { 
// controller A callback 
// should I broadcast "data" and listen for the event in controller B ?
} );

// controller B
$rootScope.$on();
// ... listen for the event sent from controller A to get "data

选项 2:

// controller A
var promise = service.doAjax(); 
shareService.sharePromise( promise ); // Sharing the promise with broadcast

// controller B
// get promise from shareService via $on()
promise.then( function( data) {} );

选项2的问题是回调函数会被执行多次。我不想共享数据,而是执行回调。

【问题讨论】:

    标签: angularjs promise angular-promise


    【解决方案1】:

    您可以分享承诺而不是分享数据。为您服务:

    var cached = null; // assumes the ajax doesn't return a falsey value
    function doAjax(){
        if(!cached) cached = $http.get(...); // actual request
        return cached;
    }
    

    这样,当两个控制器调用它时,它们将收到相同的请求 - 实际上它会由首先调用它的人触发。通过缓存承诺(而不是数据),您还可以防止一类有趣的竞争条件。

    如果你不想总是缓存结果,你可以为“你想等待的人”提供一种特殊的方法来实现一种屏障或集合模式:

    var awaiters = {};
    function randevouz(who){
        return new $q(function(resolve, reject){
             awaiters[who] = (awaiters[who] || []).concat(resolve); // add new
        });
    }
    function arrived(who){
        (awaiters[who] || []).forEach(function(x){ x(); });
    }
    

    这会让你在控制器 B 调用:

    randevouz("B").then(function(){
        // a let me know they're ready   
    });
    

    在 A 中:

    doAjax().then(function(){
        arrived("A");
    });
    

    【讨论】:

    • 谢谢。缓存 $http.get 的原因是什么?如果我不缓存它会发生什么?另外,在这种情况下,控制器之间共享的最佳实践技术是什么?
    • @Indianer 缓存一个承诺很好,“最佳实践”是自以为是的,并且 $http.get 返回一个承诺(我只是假设这是 doAjax 在内部所做的) - 所以我正在缓存它并且 不是结果。
    • 是的,这就是我的意思,为什么要缓存承诺?不缓存会导致controller B中的callback多次执行?
    • 会导致同步丢失,ajax请求被多次执行。
    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 2020-09-26
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多