angular 中的 ES6 生成器函数

ES6 generator functions in angular

最近我开始在我的 angular 项目中使用生成器。到目前为止,我是这样做的:

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 变量将不会被初始化。在我看来,angular摘要系统需要手动触发。

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

我认为这是因为您的 spawn 方法使用本机 Promise,而不是 angular 实现。尝试使用 $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);
    }
}