有沒優雅的寫法,讓nodejs的回調+循環不那麼操蛋?
when.js
使用generator+co.js配合來實現非同步回調同步化,或者更進一步,使用es7中的async/await來實現。
一個典型的例子就是koa框架,將這種技巧運用到了極致。koa1是基於generator+co.js的,而koa2則基於async/await。
下面是我寫的一篇分析koa當中非同步回調同步化原理的文章:
深入探析koa之非同步回調處理篇 | 馬齡陽的個人網站
量小的話設置個全局開關變數,用循環事件代替for就可以了,之前寫小爬蟲都是這樣處理庫依賴少,量大結構複雜就用庫吧……
Promise,generator,co, async 等都可以幫助讓代碼好看一點
不要被面向過程語言所限制
比如 @三旬叔 貼的代碼
deleteOldFile: function(callback) {
removeFile("/usr/local/opt/f1", function() {
removeFile("/usr/local/opt/f2", function() {
removeFile("/usr/local/opt/f3", function() {
removeFile("/usr/local/opt/f4", function() {
removeFile("/usr/local/opt/f5", function() {
removeFile("/usr/local/opt/f6", function() {
removeFile("/usr/local/opt/f7", function() {
removeFile("/usr/local/opt/f8", function() {
removeFile("/usr/local/opt/f9", function() {
removeFile("/usr/local/opt/f10", function() {
removeFile("/usr/local/opt/f11", function() {
removeFile("/usr/local/opt/f12", function() {
removeFile("/usr/local/opt/f13", function() {
removeFile("/usr/local/opt/f14", function() {
removeFile("/usr/local/opt/f15", function() {
removeFile("/usr/local/opt/f16", function() {
removeFile("/usr/local/opt/f17", function() {
removeFile("/usr/local/opt/f18", function() {
removeFile("/usr/local/opt/f19", function() {
removeFile("/usr/local/opt/f20", function() {
removeFile("/usr/local/opt/f21", function() {
callback callback();
});
});
});
});
});
});
});
});
});
});
});
});
});
});
});
});
});
});
});
});
});
function removeFile() {
//xxx
}
}
可以用以下方法實現
deleteOldFile: callback =&> {
const removeFile = (path, cb) =&> {
// do something async
cb();
};
const fileList = [
"/usr/local/opt/f1",
"/usr/local/opt/f2",
"/usr/local/opt/f3",
"/usr/local/opt/f4",
"/usr/local/opt/f5",
"/usr/local/opt/f6",
"/usr/local/opt/f7",
"/usr/local/opt/f8",
"/usr/local/opt/f9",
"/usr/local/opt/f10",
"/usr/local/opt/f11",
"/usr/local/opt/f12",
"/usr/local/opt/f13",
"/usr/local/opt/f14",
"/usr/local/opt/f15",
"/usr/local/opt/f16",
"/usr/local/opt/f17",
"/usr/local/opt/f18",
"/usr/local/opt/f19",
"/usr/local/opt/f20",
];
const cb_g = idx =&> () =&> {
if (idx == 19) {
callback callback();
} else {
const next = idx + 1;
removeFile(fileList[next], cb_g(next));
}
};
removeFile(fileList[0], cb_g(0));
}
蛋疼中 無良策
朴靈的 eventproxy
coES2016 typescript
async/await + Typescript/Babel
土老冒都用then.js,因為Promise,async看不懂
coffeescript
推薦閱讀:
※怎麼理解rxjs?
※項目中如何有效率的開發js?
※時至今日 (2015-10-20),看jQuery源碼還有必要嗎?
※React中,因為非同步操作的關係,組件銷毀後調用了setState(),報警告,怎麼解決?
TAG:JavaScript | Nodejs | 回調函數Callback |
