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.
|
|
|