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);
}
}
最近我开始在我的 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);
}
}