all.js 1.34 KB
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
var _ = require("./_");
var Promise = _.Promise;
var genIterator = require("./genIterator");

var tryErr = {};

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

module.exports = function (limit, list) {
    if (!_.isNumber(limit)) {
        list = limit;
        limit = Infinity;
    }

    return new Promise(function (resolve, reject) {
        var running = 0;
        var gen = genIterator(list);
        var done = false;

        function genNext () {
            running--;
            return step("next");
        }

        function genThrow (reason) {
            running--;
            return reject(reason);
        }

        function step (key) {
            if (done) {
                if (running === 0)
                    resolve();
                return;
            }

            while (running < limit) {
                var info = gen[key]();

                if (info.done) {
                    if (running === 0) resolve();
                    return done = true;
                } else {
                    running++;
                    Promise.resolve(info.value).then(genNext, genThrow);
                }
            }
        }

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

        if (ret === tryErr)
            reject(ret.err);
    });
};