JavaScript异步回调 then.jsAnother very small promise! 能用简单优美的方式将任何同步或异步回调函数转换成then()链式调用! then.js不同于其它promise,它没有resolve、也没有reject、更没有promise对象,所以你不再需要把异步任务封装成promise对象。 一个典型的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]); 若要进入下一个then链,上面then中的successHandler、errorHandler还得进行如上类似封装,搞得挺复杂! then.js只有then对象,它包括then、all和fail三个方法和触发器defer,无需封装,直接将异步任务写入then()!因为then、all和fail都能自动生成下一个then对象,reject和resolve被合并为defer并注入任务函数,reject和resolve合并为defer的好处是,简化代码,还可以直接代替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) { // ....逐步执行同步或异步任务 return next ? next() : defer(); }); }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... }); then对象取代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) { // .... }); 更多用法请参考jsGen源代码,里面包含了一百多个then任务链,几百个then对象! Who UsedAPIpromise模式:
async模式:then.each(array, function (next, value, index, array) { // 逐步执行同步或异步任务 asyncTask(value, function () { return next ? next() : callback(); }) }); InstallNode.js: npm install thenjs var then = require('thenjs'); Browser: 注意:then.js需要bind方法支持,IE8及以下请先加载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异步回调 then.jsAnother very small promise! 能用简单优美的方式将任何同步或异步回调函数转换成then()链式调用! then.js不同于其它promise,它没有resolve、也没有reject、更没有promise对象,所以你不再需要把异步任务封装成promise对象。 一个典型的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]); 若要进入下一个then链,上面then中的successHandler、errorHandler还得进行如上类似封装,搞得挺复杂! then.js只有then对象,它包括then、all和fail三个方法和触发器defer,无需封装,直接将异步任务写入then()!因为then、all和fail都能自动生成下一个then对象,reject和resolve被合并为defer并注入任务函数,reject和resolve合并为defer的好处是,简化代码,还可以直接代替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) { // ....逐步执行同步或异步任务 return next ? next() : defer(); }); }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... }); then对象取代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) { // .... }); 更多用法请参考jsGen源代码,里面包含了一百多个then任务链,几百个then对象! Who UsedAPIpromise模式:
async模式:then.each(array, function (next, value, index, array) { // 逐步执行同步或异步任务 asyncTask(value, function () { return next ? next() : callback(); }) }); InstallNode.js: npm install thenjs var then = require('thenjs'); Browser: 注意:then.js需要bind方法支持,IE8及以下请先加载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. |
|