gpt4 book ai didi

angularjs - 与其他 Controller 的回调共享来自 promise 的数据

转载 作者:行者123 更新时间:2023-12-01 01:51:12 27 4
gpt4 key购买 nike

Controller A 通过 promise 发送请求。在另一个 Controller B 中同时运行回调函数的最佳方法是什么?在原始回调中通过服务广播并在另一个 Controller 中收听它。是否有可能将 promise 传递给 Controller ​​ 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的问题是回调函数会被执行多次。我不想共享数据,而是执行回调。

最佳答案

您可以共享 promise 而不是共享数据。在您的服务中:

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

那样的话,当两个 Controller 调用它时,它们会得到相同的请求——而且它实际上会被先调用它的人触发。通过缓存 promise (而不是数据),您还可以防止一类有趣的竞争条件。

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

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(); });
}

这会让你在 Controller B 中调用:

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

在 A 中:

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

关于angularjs - 与其他 Controller 的回调共享来自 promise 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29940108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com