var wait = function(){ var task = function(){ console.log('执行完成'); } setTimeout(task, 2000); } wait();
如今在task里面的执行完成以后进行某些特别复杂的操做,代码可能会不少。那么要这么怎么办。若是继续在下面写也没有问题,可是不符合开放封闭的原则。后面颇有可能屡次再改这一大堆的代码。对修改开放,对拓展关闭。咱们须要实现对修改关闭,对拓展开放。jquery
function waitHandle(){ var dtd = $.Deferred(); // 建立一个deferred对象 var wait = function(dtd){ // 要求传入一个 deferred对象 var task = function(){ console.log('执行完成'); dtd.resolve(); // 表示异步任务已经完成 // dtd.reject(); // 表示异步任务失败或出错 } setTimeout(task, 2000); return dtd; // 要求返回deferred对席那个 } // 注意,这里必定要有返回值 return wait(dtd); }
这里面有三层函数,第一层函数是waitHandle,第二层是wait函数,第三层是task函数。这里有两个return,第一个传进did。而后进行一系列加工,返回了dtd。而后最终怎么用api
var w = waitHandle(); w.then(function(){ console.log('success1'); },function(){ console.log('error'); }) .then(function(){ console.log('success2') },function(){ console.log('error2') }); // 还有w.done 和 w.fail
总结,dtd的api可分红两类,用意不一样promise
function waitHandle(){ var dtd = $.Deferred(); // 建立一个deferred对象 var wait = function(dtd){ // 要求传入一个 deferred对象 var task = function(){ console.log('执行完成'); dtd.resolve(); // 表示异步任务已经完成 // dtd.reject(); // 表示异步任务失败或出错 } setTimeout(task, 2000); return dtd; // 要求返回deferred对席那个 } // 注意,这里必定要有返回值 return wait(dtd); } var w = waitHandle(); w.reject() // 很是不老实的作法 w.then(function(){ console.log('success1'); },function(){ console.log('error'); }).then(function(){ console.log('success2') },function(){ console.log('error2') });
function waitHandle(){ var dtd = $.Deferred(); // 建立一个deferred对象 var wait = function(dtd){ // 要求传入一个 deferred对象 var task = function(){ console.log('执行完成'); dtd.resolve(); // 表示异步任务已经完成 // dtd.reject(); // 表示异步任务失败或出错 } setTimeout(task, 2000); return dtd.promise(); // 这里返回promise,而不是直接返回deferred } // 注意,这里必定要有返回值 return wait(dtd); } var w = waitHandle(); w.then(function(){ console.log('success1'); },function(){ console.log('error'); }).then(function(){ console.log('success2') },function(){ console.log('error2') });