除了相对微不足道的功能之外,我倾向于害怕编写 Javascript 的原因之一是,当一件事真正依赖于另一件事时,我从未找到一种避免回调瀑布的体面方法。有没有这样的方法?
我现在正在开发一个 Titanium 应用程序,并遇到了这个现实世界的场景:
我有一组设施,我需要计算与用户当前位置的距离。这需要获取用户的当前位置(只需要发生一次),并且在遍历设施位置时,获取每个位置的位置并计算距离。检索位置(long/lat)的 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 和闭包的语言的爆炸式增长,我一直认为一定有人找到了一种方法来保持这些瀑布的可管理性,但我还没有找到一个很好的解释来解释如何组织这样的解决方案。
有什么建议或提示吗?
任何见解将不胜感激。