我希望在应用一些异步操作的同时,按照顺序通过多个数组迭代。
是否有另一种方法可以获得将在Node中工作的Array迭代器?有什么办法可以让我摆脱这些回调吗?
let viewModel = {
pages: [
{
id: 'pageOne',
states: [
{
id: 'stateOne'
},
{
id: 'stateTwo'
},
{
id: 'stateThree'
}
]
},
{
id: 'pageTwo',
states: [
{
id: 'stateOne'
},
{
id: 'stateTwo'
},
{
id: 'stateThree'
}
]
}
]
};
function* arrayIterator(_array){
while(_array.length > 0) yield _array.shift();
}
function loadBrowser(){
return pseudoAsync('loaded browser');
}
function stateActions(state){
return pseudoAsync('actioning: ' + state.id);
}
function processState(state, states, callback) {
if(!state.done) {
console.log(state.value.id);
stateActions(state.value).then(()=>{
processState(states.next(), states, callback);
});
} else {
callback();
}
}
function processPage(page, pages) {
if(!page.done){
console.log(page.value.id);
loadBrowser().then(()=>{
let states = arrayIterator(page.value.states);
processState(states.next(), states, ()=>{
processPage(pages.next(), pages);
});
});
}
}
let pages = arrayIterator(viewModel.pages);
processPage(pages.next(), pages);
function pseudoAsync(message){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log(message);
resolve();
}, 2000)
});
}柱塞
这是预期的输出顺序:
谢谢你的帮助
发布于 2018-02-20 17:45:32
既然你已经标记了你的问题async/await,为什么不直接使用它呢?
for (const page of viewModel.pages) {
console.log(page.id);
await loadBrowser();
for (const state of page.states) {
console.log(state.id);
await stateActions(state);
}
}是否有另一种方法可以获得将在Node中工作的Array迭代器?
当然可以:arr[Symbol.iterator]()或arr.values()。它被for … of隐式使用。
有什么办法可以让我摆脱这些回调吗?
正确地使用承诺,不要尝试手动推进迭代器。
https://stackoverflow.com/questions/48891136
复制相似问题