为什么要用 promise/then (why to use promise)
访问量: 2958
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. )
是不是可读性 更强了呢?
代码的可读性, 是精英 跟 普通人的 明显技能差别。
多参与开源项目,多跟其他程序员协作,可以快速提高自己的代码可读性。