支持Promise

Promise 是解决传统回调陷阱(callback hell)的一个策略。如果还不了解的 Promise 的,这篇 Javascript-Promise 迷你书会是最好选择,详细介绍了前世今生、设计哲学和使用方法。

如果使用promise,我们解决第一节中的问题就会是如下代码:

function size(filename) {
    return new Promise((resolve, reject)=>{
        fs.stat(filename, (err, stat) => {
            if(err)
                reject(err);
            else
                resolve(stat.size);
        });
    });
}

function *main() {
    const sizeInfo = {
        'file1': 0,
        'file2': 0,
        'file3': 0
    };
    try{
        sizes = yield Promise.all([
            size('file1.md'),
            size('file2.md'),
            size('file3.md')
        ]);

        sizeInfo['file1'] = sizes[0];
        sizeInfo['file2'] = sizes[1];
        sizeInfo['file3'] = sizes[2];
    } catch(error) {
        console.error('error:', error);
    }
    console.dir(sizeInfo);
}

可以用如下的方式判断一个对象是否是 Promise 对象:

function isPromise(obj) {
    return obj && typeof obj.then === 'function';
}

为了支持以 Promise 构建业务逻辑,就需要对运行器作出如下修改:

function runGenerator(gen) {
    // 先获得迭代器
    const it = gen();
    // 驱动generator运行
    next();

    function next(err, res) {
        // ...
        if (isPromise(value)) {
            value.then(function(res) {
                next(null, res);
            }, function(err) {
                next(err);
            });
        }
        if (Array.isArray(value)) {
            // ...
        }
        if (typeof value === 'function') {
            // ...
        }

    }
}

到本节末为止,我们借助于一个运行器 runGenerator 就可以用更优雅的、同步式的方式来组织我们的业务流程,在接下来的章节,我们着重优化这个工具函数。

results matching ""

    No results matching ""