Back

为什么要用 promise/then (why to use promise)

发布时间: 2015-01-17 00:04:00

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. )

是不是可读性 更强了呢? 

代码的可读性, 是精英 跟 普通人的 明显技能差别。  

多参与开源项目,多跟其他程序员协作,可以快速提高自己的代码可读性。

Back