Ascs基于 Fiber 實(shí)現(xiàn) async/await 庫(kù)
Ascs == as C#,基于 Fiber 實(shí)現(xiàn)的類似于C# 的 async/await 的庫(kù),擺脫 callback 的痛苦。
Promise 大家都懂,但是在 JS 這個(gè)這么喜歡做輪子的領(lǐng)域里面不做一個(gè)好像對(duì)不起自己似的。
Ascs 很簡(jiǎn)單,就 3 個(gè) API:
Ascs.env 相當(dāng)于聲明這是一個(gè)異步(async)的環(huán)境,在這里面 ascs 才有效
Ascs.conv 把一個(gè)常規(guī)的異步回調(diào)函數(shù)轉(zhuǎn)換為 ascs 的異步函數(shù),讓你告別回調(diào)(callback必須要是最后一個(gè)參數(shù))
Ascs.await 執(zhí)行 ascsFunction 之后會(huì)返回一個(gè) task,使用這個(gè)函數(shù) ascs.await(task) 可以等待返回并且獲取返回值
下面是一個(gè)簡(jiǎn)單的例子:
function delayToDo(a, b, cb) {
var result = a + b;
setTimeout(function() {
cb(result * result);
}, 1000);
}
var delayToDoAsync = ascs.conv(delayToDo);
ascs.env(function() {
// 一般寫法
delayToDo(1, 2, function(r) {
console.log(r);
});
// ascs寫法,等待返回
var result = ascs.await(delayToDoAsnc(1, 2));
console.log(result[0]); // 返回的是數(shù)組,相當(dāng)于是回調(diào)函數(shù)參數(shù)
})();
更多例子可以看 demo
常見問(wèn)題:
瀏覽器能用嗎?
做的時(shí)候沒想過(guò)瀏覽器,我又不是前端。想前后端兼容的建議用wind.js啊
和ES6兼容嗎?
可以看看commit的歷史,其實(shí)曾經(jīng)想過(guò)兼容,但是generator的yield的作用于并不能實(shí)現(xiàn)像Lua那種效果,所以還是放棄了。不過(guò)由于是基于Fiber實(shí)現(xiàn),基本上node/iojs都可以用。
ES7 也有async await,這玩意還有用嗎?
等ES7出來(lái)再算吧...ES6都還沒全
還有什么要說(shuō)?
ascs只是一種嘗試,沒有什么野心,就是走心,玩玩。另外,相比起實(shí)際項(xiàng)目,ascs更加適合用于制作library,可以很方便為你的庫(kù)提供async/await風(fēng)格的接口(使用ascs.conv轉(zhuǎn)換一下就好),實(shí)際項(xiàng)目改造起來(lái)會(huì)需要一定工作。
更多請(qǐng)關(guān)注 https://github.com/drzunny/ascs
