genertor转Async函数实现

78 阅读1分钟
function genertorToAsync (fn) {
    return function () {
        return new Promise((resolve, reject) => {
            const gn = fn.call(this, arguments);
            // 采用递归的方式调用next
            function _next(value) {
                const { value, done } = gn.next(value);
                if (done) {
                    return resolve(value);
                } else {
                    return Promise.resolve(value).then(() => {
                        _next(value);
                    }, (err) => {
                        reject(err);
                    })
                }
            }
            _next();
        });
    }
}