js中then()函数详解

2016-09-12  本文已影响2854人  Marco_Deng

then: function (callback, errback) {
var result = defer();

      var wrappedCallback = function(value) {  
        try {  
          result.resolve((callback || defaultCallback)(value));  
        } catch(e) {  
          exceptionHandler(e);  
          result.reject(e);  
        }  
      };  

      var wrappedErrback = function(reason) {  
        try {  
          result.resolve((errback || defaultErrback)(reason));  
        } catch(e) {  
          exceptionHandler(e);  
          result.reject(e);  
        }  
      };  

      if (pending) {  
        pending.push([wrappedCallback, wrappedErrback]);  
      } else {  
        value.then(wrappedCallback, wrappedErrback);  
      }  

      return result.promise;  
    }   

always: function (callback) {  
        
      function makePromise(value, resolved) {  
        var result = defer();  
        if (resolved) {  
          result.resolve(value);  
        } else {  
          result.reject(value);  
        }  
        return result.promise;  
      }  
        
      function handleCallback(value, isResolved) {  
        var callbackOutput = null;              
        try {  
          callbackOutput = (callback ||defaultCallback)();  
        } catch(e) {  
          return makePromise(e, false);  
        }              
        if (callbackOutput && callbackOutput.then) {  
          return callbackOutput.then(function() {  
            return makePromise(value, isResolved);  
          }, function(error) {  
            return makePromise(error, false);  
          });  
        } else {  
          return makePromise(value, isResolved);  
        }  
      }  
        
      return this.then(function(value) {  
        return handleCallback(value, true);  
      }, function(error) {  
        return handleCallback(error, false);  
      });  
    }   

有两个部分,then 和 always,两个都是可执行的方法。
always 这里不作讨论。来看看then ,它有两个参数,callback 和 errback, 第一个用来处理“resolved”和“success”事件;第二个用来处理“rejected”和“failure”事件。
所以,delay.promise不是现成的数据,还不能直接使用。然后来看看这个then怎么使用(主要是如何从中提取出我们需要的后台返回的数据):

上一篇 下一篇

猜你喜欢

热点阅读