node.js - NodeJS:用generic flow control来解决boomerang效应的疑惑
阿神
阿神 2017-04-17 11:33:49
0
1
490

这段代码是在node高级编程19章Listing 19-3,cascade function 看不明白,能帮忙给解释下吗?

var fs = require('fs');
function cascade(callbacks, callback) {
// clone the array
    var functions = callbacks.slice(0);
    function processNext(err) {
        if (err) {
            return callback(err);
        }
        var args = Array.prototype.slice.call(arguments);
        var func = functions.shift();
        if (func) {
            // remove first argument containing the error
            args.shift();
        } else {
            func = callback;
        }
        args.push(processNext);
        func.apply(this, args);
    }
    processNext.call(this);
}
function append_some_a_to_b(callback) {
    var aFd, bFd,
        buffer = new Buffer(10);
    cascade([
        function open_a(next) {
            fs.open(__dirname + '/a.txt', 'r', next);
        },
        function read_from_a(fd, next) {
            aFd = fd;
            fs.read(aFd, buffer, 0, buffer.length, 0, next);
        },
        function close_a(bytesRead, buf, next) {
            fs.close(aFd, next);
        },
        function open_b(next) {
            fs.open(__dirname + '/b.txt', 'a', next);
        },
        function stat_b(fd, next) {
            bFd = fd;
            fs.fstat(bFd, next);
        },
        function write_b(bStats, next) {
            fs.write(bFd, buffer, 0, buffer.length, bStats.size, next);
        },
        function close_b(bytesWritten, buf, next) {
            fs.close(bFd, next);
        }
    ], callback);
};
console.log('starting...');
append_some_a_to_b(function done(err) {
    if (err) {
        throw err;
    }
    console.log('done');
});

谢谢各位了!

阿神
阿神

闭关修行中......

全部回覆(1)
Ty80

cascade 函數做的, 就是把下面的每個函數, 按序依次執行, 並僅在異步任務完成後執行下一個函數, 外加錯誤處理.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!