有沒優雅的寫法,讓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


co

ES2016

typescript


async/await + Typescript/Babel


土老冒都用then.js,因為Promise,async看不懂


coffeescript


推薦閱讀:

怎麼理解rxjs?
項目中如何有效率的開發js?
時至今日 (2015-10-20),看jQuery源碼還有必要嗎?
React中,因為非同步操作的關係,組件銷毀後調用了setState(),報警告,怎麼解決?

TAG:JavaScript | Nodejs | 回調函數Callback |

分頁阅读: 1 2