ES6发电机功能有角度

时间:2016-02-06 09:22:04

标签: javascript angularjs angularjs-scope ecmascript-6 angular-promise

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

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变量,则无法初始化。在我看来,需要手动触发角度消化系统。

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

1 个答案:

答案 0 :(得分:1)

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