我有以下代码,虽然在这个例子中没有任何异步我写它来理解使用生成器和promises的流程。
我的目标是遍历数组并为数组中的每个项执行异步过程,我想按顺序执行。从我所读到的,我期待yield operator(rule);
将产生已解决的承诺的价值。而不是值false
,它给了我一个承诺,如下面的Promise { false }
我认为我在这个流程中缺少/误解了一些重要的东西。
这是代码:
'use strict';
let operator = function (rule) {
return new Promise((resolve, reject) => {
resolve(rule.bool);
});
};
let setOfRule = [
{
name: 'one',
bool: false
},
{
name: 'two',
bool: false
},
{
name: 'three',
bool: false
}
];
let myGen = function* (rules) {
for (let rule of rules) {
try {
yield operator(rule);
} catch (e) {
console.log(e);
}
}
};
for (let filtered of myGen(setOfRule)) {
console.log(filtered); // Promise { false }
console.log(`Is it filtered: ${filtered}`); // Is it filtered: [object Object]
if (filtered) {
break;
}
}
答案 0 :(得分:1)
我在这里找到了这篇不错的文章和一段很好的代码 http://www.html5rocks.com/en/tutorials/es6/promises/
而不是尝试迭代我的生成器X次并获取值。我正在迭代值并在每次迭代中产生承诺。 on解决它使用我的iterable的下一个方法解析promise,否则它会抛出throw错误。
这是工作代码:
'use strict';
let operator = function (rule) {
return new Promise((resolve, reject) => {
resolve(rule.bool);
});
};
let setOfRule = [
{
name: 'one',
bool: false
},
{
name: 'two',
bool: false
},
{
name: 'three',
bool: false
}
];
let spawn = function spawn(generatorFunc) {
function continuer(verb, arg) {
let 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);
}
}
let generator = generatorFunc();
let onFulfilled = continuer.bind(continuer, 'next');
let onRejected = continuer.bind(continuer, 'throw');
return onFulfilled();
}
spawn(function *() {
try {
for (let rule of setOfRule) {
let something = yield operator(rule);
console.log(something);
}
console.log('Done!!!!');
} catch (err) {
console.log('Error: ', err);
}
});