JavaScript異步回調(diào) then.jsAnother very small promise! 能用簡(jiǎn)單優(yōu)美的方式將任何同步或異步回調(diào)函數(shù)轉(zhuǎn)換成then()鏈?zhǔn)秸{(diào)用! then.js不同于其它promise,它沒(méi)有resolve、也沒(méi)有reject、更沒(méi)有promise對(duì)象,所以你不再需要把異步任務(wù)封裝成promise對(duì)象。 一個(gè)典型的promise都要封裝: function getFile() { var deferred = Q.defer(); FS.readFile("foo.txt", "utf-8", function (error, text) { if (error) { deferred.reject(new Error(error)); } else { deferred.resolve(text); } }); return deferred.promise; } getFile().then(successHandler[, errorHandler]); 若要進(jìn)入下一個(gè)then鏈,上面then中的successHandler、errorHandler還得進(jìn)行如上類(lèi)似封裝,搞得挺復(fù)雜! then.js只有then對(duì)象,它包括then、all和fail三個(gè)方法和觸發(fā)器defer,無(wú)需封裝,直接將異步任務(wù)寫(xiě)入then()!因?yàn)閠hen、all和fail都能自動(dòng)生成下一個(gè)then對(duì)象,reject和resolve被合并為defer并注入任務(wù)函數(shù),reject和resolve合并為defer的好處是,簡(jiǎn)化代碼,還可以直接代替callback! then.js使用模式直鏈: then(function (defer) { // .... defer(err, ...); }).then(function (defer, value) { // .... defer(err, ...); }, function (defer, err) { // .... defer(err, ...); }).then(function (defer) { // .... defer(err, ...); }).all(function (defer, err, value) { // .... defer(err, ...); }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... }); 嵌套: then(function (defer) { // .... defer(err, ...); }).then(function (defer, value) { //第二層 then(function (defer2) { // .... defer2(err, ...); }).then(function (defer2, value) { //第三層 then(function (defer3) { // .... }).all(defer2); // 返回二層 }).then(function (defer2) { // .... defer(err, ...); // 返回一層 }).fail(defer); // 返回一層 }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... }); async 嵌套: then(function (defer) { // .... defer(err, array); }).then(function (defer, array) { then.each(array, function (next, value) { // ....逐步執(zhí)行同步或異步任務(wù) return next ? next() : defer(); }); }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... }); then對(duì)象取代callback: function getFileAsync() { return then(function (defer) { readFile(failname, defer); }).then(function (defer, fileContent) { // 處理fileContent defer(null, result); }).fail(function (defer, err) { // 處理error defer(err); }); } getFileAsync().then(function (defer, file) { // .... }).fail(function(defer, err) { // .... }); 更多用法請(qǐng)參考jsGen源代碼,里面包含了一百多個(gè)then任務(wù)鏈,幾百個(gè)then對(duì)象! Who UsedAPIpromise模式:
async模式:then.each(array, function (next, value, index, array) { // 逐步執(zhí)行同步或異步任務(wù) asyncTask(value, function () { return next ? next() : callback(); }) }); InstallNode.js: npm install thenjs var then = require('thenjs'); Browser: 注意:then.js需要bind方法支持,IE8及以下請(qǐng)先加載es5-shim.js Examplesthen(function (defer) { // start asnys task // use defer as callback function asnycTask1(param, defer); }). then(function (defer, value1, ...) { // successHandler, value1, ... from asnycTask1 asnycTask2(value1, ..., defer); }, function (defer, err) { // errorHandler, err from asnycTask1 console.error(err); }). then(function (defer, value) { // successHandler, value from asnycTask2 asnycTask3(value, defer); }). then(function (defer, value) { // successHandler, value from asnycTask3 asnycTask4(value, defer); }). fail(function (defer, err) { // global errorHandler, err from asnycTask2 or asnycTask3 console.error(err); });No tags for this post. JavaScript異步回調(diào) then.jsAnother very small promise! 能用簡(jiǎn)單優(yōu)美的方式將任何同步或異步回調(diào)函數(shù)轉(zhuǎn)換成then()鏈?zhǔn)秸{(diào)用! then.js不同于其它promise,它沒(méi)有resolve、也沒(méi)有reject、更沒(méi)有promise對(duì)象,所以你不再需要把異步任務(wù)封裝成promise對(duì)象。 一個(gè)典型的promise都要封裝: function getFile() { var deferred = Q.defer(); FS.readFile("foo.txt", "utf-8", function (error, text) { if (error) { deferred.reject(new Error(error)); } else { deferred.resolve(text); } }); return deferred.promise; } getFile().then(successHandler[, errorHandler]); 若要進(jìn)入下一個(gè)then鏈,上面then中的successHandler、errorHandler還得進(jìn)行如上類(lèi)似封裝,搞得挺復(fù)雜! then.js只有then對(duì)象,它包括then、all和fail三個(gè)方法和觸發(fā)器defer,無(wú)需封裝,直接將異步任務(wù)寫(xiě)入then()!因?yàn)閠hen、all和fail都能自動(dòng)生成下一個(gè)then對(duì)象,reject和resolve被合并為defer并注入任務(wù)函數(shù),reject和resolve合并為defer的好處是,簡(jiǎn)化代碼,還可以直接代替callback! then.js使用模式直鏈: then(function (defer) { // .... defer(err, ...); }).then(function (defer, value) { // .... defer(err, ...); }, function (defer, err) { // .... defer(err, ...); }).then(function (defer) { // .... defer(err, ...); }).all(function (defer, err, value) { // .... defer(err, ...); }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... }); 嵌套: then(function (defer) { // .... defer(err, ...); }).then(function (defer, value) { //第二層 then(function (defer2) { // .... defer2(err, ...); }).then(function (defer2, value) { //第三層 then(function (defer3) { // .... }).all(defer2); // 返回二層 }).then(function (defer2) { // .... defer(err, ...); // 返回一層 }).fail(defer); // 返回一層 }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... }); async 嵌套: then(function (defer) { // .... defer(err, array); }).then(function (defer, array) { then.each(array, function (next, value) { // ....逐步執(zhí)行同步或異步任務(wù) return next ? next() : defer(); }); }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... }); then對(duì)象取代callback: function getFileAsync() { return then(function (defer) { readFile(failname, defer); }).then(function (defer, fileContent) { // 處理fileContent defer(null, result); }).fail(function (defer, err) { // 處理error defer(err); }); } getFileAsync().then(function (defer, file) { // .... }).fail(function(defer, err) { // .... }); 更多用法請(qǐng)參考jsGen源代碼,里面包含了一百多個(gè)then任務(wù)鏈,幾百個(gè)then對(duì)象! Who UsedAPIpromise模式:
async模式:then.each(array, function (next, value, index, array) { // 逐步執(zhí)行同步或異步任務(wù) asyncTask(value, function () { return next ? next() : callback(); }) }); InstallNode.js: npm install thenjs var then = require('thenjs'); Browser: 注意:then.js需要bind方法支持,IE8及以下請(qǐng)先加載es5-shim.js Examplesthen(function (defer) { // start asnys task // use defer as callback function asnycTask1(param, defer); }). then(function (defer, value1, ...) { // successHandler, value1, ... from asnycTask1 asnycTask2(value1, ..., defer); }, function (defer, err) { // errorHandler, err from asnycTask1 console.error(err); }). then(function (defer, value) { // successHandler, value from asnycTask2 asnycTask3(value, defer); }). then(function (defer, value) { // successHandler, value from asnycTask3 asnycTask4(value, defer); }). fail(function (defer, err) { // global errorHandler, err from asnycTask2 or asnycTask3 console.error(err); });No tags for this post. |
|