async.js 926 Bytes
Newer Older
huahua committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
var Promise = require("./_").Promise;

var tryErr = {};

function tryCatch (step, key) {
    try {
        return step(key);
    } catch (err) {
        tryErr.err = err;
        return tryErr;
    }
}

module.exports = function (generator) {
    return function () {
        var gen = generator.apply(this, arguments);

        function genNext (val) {
            return step("next", val);
        }

        function genThrow (val) {
            return step("throw", val);
        }

        function step (key, val) {
            var info = gen[key](val);

            if (info.done) {
                return Promise.resolve(info.value);
            } else {
                return Promise.resolve(info.value).then(genNext, genThrow);
            }
        }

        var ret = tryCatch(step, "next");

        if (ret === tryErr)
            return Promise.reject(ret.err);
        else
            return ret;
    };
};