refer to: http://blog.parse.com/2013/01/29/whats-so-great-about-javascript-promises/
在之前使用ruby 的时候,promise 没有引起我太大的注意。仅仅是留意到 jquery.deffer 使用了.then()的方法。
但是现在,项目中的JS是使用async的方式来访问远程资源,所以动辄代码就会难以阅读。提取方法吧,也可以,但是初期提取的方法不太好用,使用了 全局变量 + setTimeout的形式。
// 例如: 原来的代码:
call_remote = function(){
url = 'remote-url';
url.open(
function on_success(){
// 处理访问成功
remote_result = ooxx
},
function on_error(){
alert('访问失败')
})
}
后来,这个代码提取了 全局变量, 成为:
var = global_result;
call_remote = function(url_to_call){
function on_success(){
global_result = ooxx.
}
}
// 调用方式:
call_remote('http://host/interface...')
// 等待1 秒之后再 设置table_view的内容
setTimeout( table_view.set_value(global_result), 1000)
两个问题:
1. 如果网络稍差, 远程服务器 在1.3秒才返回结果, 是不是这个TableView就无法显示了?
2. 如果网络较好, 10ms 就返回结果了, 那么等待的 990ms是不是巨大的浪费?
所以, setTimeout 是不适合用在这里的。(用于演示时, 也频频出错。这让我们自己都不自信)
再看个别人的例子:
Parse.User.logIn("user", "pass", {
success: function(user) {
query.find({
success: function(results) {
results[0].save({ key: value }, {
success: function(result) {
// the object was saved.
}
});
}
});
}
});
总共出现3个层次的 success . 这样的代码跟下面的代码对比一下可读性:
Parse.User.logIn("user", "pass").then(function(user) {
return query.find();
}).then(function(results) {
return results[0].save({ key: value });
}).then(function(result) {
// the object was saved.
});
为了让结果更显然,我使用coffee:
Parse.User.logIn("user", "pass").
then( (user) -> query.find()).
then( (results) -> results[0].save({ key: value })).
then( (result) -> // the object was saved. )
是不是可读性 更强了呢?
代码的可读性, 是精英 跟 普通人的 明显技能差别。
多参与开源项目,多跟其他程序员协作,可以快速提高自己的代码可读性。