gpt4 book ai didi

javascript - 如何避免回调 "waterfall"?

转载 作者:数据小太阳 更新时间:2023-10-29 06:08:25 27 4
gpt4 key购买 nike

除了相对琐碎的功能之外,我倾向于害怕为任何东西编写 Javascript 的原因之一是我从来没有找到一种合适的方法来避免当一件事真正依赖于另一件事时的回调瀑布。有这样的方法吗?

我现在正在开发 Titanium 应用程序并遇到了这个真实世界的场景:

我有一组设施,我需要计算与用户当前位置的距离。这需要获取用户的当前位置(只需要发生一次),并且在遍历设施位置时获取每个位置的位置并计算距离。检索位置(经/纬度)的 API 是异步的,因此“简单”方法如下所示(伪代码如下):

foreach facility {
API.getCurrentLocation( function( location ) { // async, takes a callback fxn arg
var here = location.coordinates;

API.getFacilityLocation( function( e ) { // async, takes a callback fxn arg
var there = e. coordinates;
var distance = API.calculateFrom( here, there );
});
});
}

因为这一切都在循环中,所以我每次都在计算我的当前位置——比我真正需要做的更多的工作。我还没有设法以这样一种方式重构它,即我只获取一次当前位置并且仍然可以使用该位置进行距离计算。

鉴于支持 lambda 和闭包的语言呈爆炸式增长,我一直在想一定有人找到了一种方法来保持这些瀑布的可管理性,但我还没有找到一个很好的解释来说明如何组织这样的解决方案。

有什么建议或提示吗?

任何见解将不胜感激。

最佳答案

基本策略:回调不使用匿名函数,将循环移到返回当前位置时运行的回调中。

例子:

function recieveCurrentLocation(location) { // async, takes a callback fxn arg
var here = location.coordinates;

// Have to define this callback in the inner scope so it can close
// over the 'here' value
function recieveFacilityLocation(e) {
var there = e. coordinates;
var distance = API.calculateFrom( here, there );
}

foreach facility {
API.getFacilityLocation(recieveFacilityLocation);
}
}

API.getCurrentLocation(recieveCurrentLocation);

关于javascript - 如何避免回调 "waterfall"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8137361/

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