【问题标题】:ES6 generator functions in angularES6 生成器在 Angular 中的作用
【发布时间】:2016-02-06 09:22:03
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2016-08-22
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2016-08-21
      • 2019-05-08
      • 2021-04-18
      相关资源
      最近更新 更多