最近我开始在角度项目中使用生成器。到目前为止我是如何做到的:
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
变量,则无法初始化。在我看来,需要手动触发角度消化系统。
为什么这样,有没有办法让这个更干净?
答案 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);
}
}