ES6 发生器以角度形式运行

ES6 generator functions in angular

本文关键字:运行 发生器 ES6      更新时间:2023-09-26

最近我开始在我的角度项目中使用生成器。到目前为止,我是怎么做到的:

function loadPosts(skip) {
    return $rootScope.spawn(function *() {
        try {
            let promise = yield User.findAll();
            $timeout(function () {
                // handle the user list
            });
        } catch (err) {
            // handle err
        }
    });
} 

根据我所读到的内容,下一部分在 es7 中不是必需的,但目前我在应用程序的运行块中具有spawn函数。

$rootScope.spawn = function (generatorFunc) {
    function continuer(verb, arg) {
        var result;
        try {
            result = generator[verb](arg);
        } catch (err) {
            return Promise.reject(err);
        }
        if (result.done) {
            return result.value;
        } else {
            return Promise.resolve(result.value).then(onFulfilled, onRejected);
        }
    }
    var generator = generatorFunc();
    var onFulfilled = continuer.bind(continuer, "next");
    var onRejected = continuer.bind(continuer, "throw");
    return onFulfilled();
};

一切都按照我目前的方式进行,我唯一不喜欢的是,每次承诺后我都必须打电话给$timeout()。如果我不这样做,则在超时内初始化的$scope变量将不会初始化。在我看来,角摘要系统需要手动触发。

为什么会这样,有没有办法让它更干净?

我认为这是因为您的spawn方法使用本机Promise s,而不是角度实现。尝试改用$q

function continuer(verb, arg) {
    var result;
    try {
        result = generator[verb](arg);
    } catch (err) {
        return $q.reject(err);
    }
    if (result.done) {
        return result.value;
    } else {
        return $q.resolve(result.value).then(onFulfilled, onRejected);
    }
}