Jquery Deferred 对比 Promise
javascript处理异步逻辑有多种方式,这里只对比 JQuery的Deferred 和 ES6的Promise。场景是判断网页中所有图片是否加载完(加载异常404也算加载完毕)。
JQuery Deferred 方式
1 var imgdefereds = []; 2 $('img').each(function () { 3 var dfd = $.Deferred(); 4 5 $(this).bind('load', () => dfd.resolve()) // 6 .bind('error', () => dfd.resolve()); 7 8 if (this.complete) 9 dfd.resolve() 10 11 imgdefereds.push(dfd); 12 }); 13 14 $.when.apply(null, imgdefereds).done(() => { 15 console.info("Jquery Deferred 所有图片加载完"); 16 });
ES6 Promise
1 let ps = $("img").map((i, dom) => { 2 if (dom.complete) 3 return Promise.resolve("complete"); 4 5 return new Promise((resolve, reject) => { 6 $(dom).bind('load', () => resolve("load")) // 7 .bind('error', () => resolve("error")) // 8 }); 9 }); 10 11 Promise.all(ps).then(() => { 12 console.info("Promise 所有图片加载完成") 13 })
总结:这两种方式整体来说,Promise更简洁,未来的趋势。