我发现自己写了很多在Javascript意大利面条的时候我必须处理异步 应用(特别是与所有的数据必须通过JS获得 OpenSocial的代码打交道时) 。通常的模式是这样的:如何避免在Javascript
- 用户第一次登录到应用程序,获取他的数据。
- 对他的数据做A(例如通过向服务器发送请求来获得他的朋友)。
- 对此数据执行B操作(例如,将他的朋友发送给服务器进行一些处理)。
- 对他的数据做C(例如,检查服务器响应是否有效,以便我们可以做其他事情)。
请注意,此顺序执行路径(1 => 2 => 3 => 4)不适合异步。性质 Ajax,所以用户最终等待很长时间,代码变成一团糟,因为每个步骤 取决于以前的。
的代码示例:
gadgets.util.registerOnLoadHandler(setupUser())
...
function setupUser() {
var req = [get data and setup request]
req.send(some_url, some_data, function(response) { getFriendsFor(response.user) });
}
function getFriendsFor(user) {
var friends = [get friends from user]
var req = [setup request]
req.send(some_other_url, some_other_data, function(response { validateFriendsResponse(response.friends) });
}
function validateFriendsResponse(friends) {
if (friends.valid())
...
loadCanvas();
}
你可以看到每个函数依赖于前一个,更糟糕的是,它在 被称为一个特定的顺序是有用的。当用户在等待时添加诸如显示/隐藏加载 屏幕和其他噱头之类的东西时,情况会变得更糟。
你会如何去修复呢?
煮它,直到它是人类 – 2009-10-15 15:41:55
您的主要担心似乎是用户最终等待很长时间才能完成所有这些。为什么不在每次请求返回后向用户提供一些反馈,以便他们知道发生了什么。它可以像3阶段进度条一样简单,或者告诉用户发生了什么。 (你甚至可以用“reticulating splines”消息来形容meme apeal。) – 2009-10-15 16:18:26
Sam:我现在用一个可爱的机器人拍着手臂显示加载屏幕,但是代码也让我担心,因为我知道我会有一些在几个月内阅读它的问题。 – 2009-10-16 16:06:29