《javascript异步编程》读书笔记1

 

jquery deferred是一个异步回调的机制

  • 目前,jQuery的Ajax方法($.ajax,$get,$post)返回的都是Promise对象。
  • 异步回调的适合作用于i/o事件,要等待用户动作才能做出相应的callback。
    •   比如,传递promise对象就相当于声明:“你感兴趣的某某事就要发生了,想知道什么时候完事吗?给这个promise一个回调就行了!“
  • promise对象和EventEmitter对象一样,允许向同一个事件绑定任意多的处理器(堆积技术)
    •   如$('#doucment').click(callback1).click(callback2);    ----EventEmitter
    •       fn().then(callback1).then(callback2ForCallback1);    ----promise
  • Promise对象有多个结果
    •   done(callbakc)
    •       fail(callback)
    •       always(callback)    不管成功失败总是调用
    •       progress(callback)   对于挂起状态的Deferred对象调用notify时,运行progress回调
  • Deferred是promise对象的超集,它比Promise多了一项关键特性:可以直接触发;而纯Promise实例只允许添加多个调用,而且必须由其他什么东西触发调用
    •   resolve()会直接触发done
    •       reject()会直接触发fail
    •       notify会调用我们设定的progress回调
    •       三者都能接受任意参数
          <textarea id="document"></textarea>
          <p id="indicator"></p>
      
          <script type="text/javascript" src="jquery.js"></script>
          <script type="text/javascript">
          //创建一个deferred对象
          var defer = $.Deferred();
          var wordGoal = 30;
          //defer挂起时的callback
          defer.progress(function (wordCount) {
              var percentComplete = Math.floor(wordCount/wordGoal*100);
              $('#indicator').text(percentComplete + '%complete');
          });
          //defer完成时的callback
          defer.done(function(msg) {
              $('#indicator').text(msg);
          });
      
          //事件回调
          $('#document').on('keypress', function() {
              var wordCount = $(this).val().split(/\s+/).length;
              //回调中监听完成事件并触发
              if (wordCount >= wordGoal) {
                  defer.resolve('Good job!');
              }
              //回调中监听挂起事件并处罚
              defer.notify(wordCount);
          });
          </script>

       

      *一旦执行了defer对象,再做defer的notify将不会有任何反应,就像任何额外的resolve调用及reject调用也会被无视一样

   

  •     $.when可以判断一组异步任务何时完成。假如我们需要两个异步事件一结束,立即调用某个事件  
    •   例子1$.when(tutorialPromise, gameLoadedPromise).done(startGame)
    •       另一个绝佳的用法是合并多重ajax调用:  
      •   $.when($.post('/1'. data1), $.post('/2'. data2)).then(onPosted, onFailure)
      •      如果要调用这两个post的回调函数,一般这样把参数提出来
        var severData = {};
        var getting1 = $.get('/1').done(function (reuslt) {
            severData['1'] = result;
        });
        var getting2 = $.get('/2').done(function (reuslt) {
            severData['2'] = result;
        });
        $.when(getting1, getting2).done(function() {
            //此时所有信息都已经位于severData...
        });

        最好不要用以下这样的回调

      • $.when(promise1, promise2).done(function(promise1Args, promise2Args) {
            //...
        });

        如果promise1时用到一个参数‘complete’,promise2用到了3个参数(1,2,3) ,则promise1Args就是'complete',promise2Args就是[1,2,3]  

      •       函数promise用法:$.when及其他能取用primise对象的jquery方法/非promise对象作为参数(p57).jquery选择器会检查$.when的哥哥参数是否带有promise的方法,有就是用该方法返回的值 
posted @ 2014-09-02 12:04  欧欧欧子  阅读(237)  评论(0)    收藏  举报