三種Javascript(NodeJS)非同步程式設計程式碼模式比較

Yujie Zhou發表於2013-11-16

對於從其它語言平臺轉到NodeJS的程式設計師來講,非同步程式設計程式碼模式是一大難題,這篇文章比較三種程式碼模式。

原生 - 瘋狂的巢狀回撥,糟糕的異常處理

fs.readdir('.', function (err, files) {
    if (err)
        throw new Error(err);
    var stats = [];
    files.map(function (file, idx) {
        fs.stat(file, function (err, stat) {
            if (err)
                throw new Error(err);
            stats[idx] = stat;
            if (stats.length === files.length)
                console.log(stats);
        });
    })
})

Promise/Q - 沒有巢狀回撥,強大的異常處理

var readdir = Q.nbind(fs.readdir);
var stat = Q.nbind(fs.stat);
readdir('.')
.then(function (files) {
    return Q.all(files.map(function (file) {
        return stat(file);
    }));
})
.done(console.log);

Promise/Q + ES6 Generator - 非同步的程式碼看上去就像同步的程式碼一樣

var readdir = Q.nbind(fs.readdir);
var stat = Q.nbind(fs.stat);
Q.async(function*() {
    var files = yield readdir('.');
    return yield Q.all(files.map(function(file) {
        return stat(file);
    }));
})()
.done(console.log); 

Promise + co - 最華麗解決方案

var co = require('co');
var fs = require('mz/fs');
co(function* () {
  var files = yield fs.readdir('.');
  return yield files.map(function (file) {
    return fs.stat(file);
  });
})
.then(console.log);

相關文章