首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用异步操作按顺序迭代的最佳方法

使用异步操作按顺序迭代的最佳方法
EN

Stack Overflow用户
提问于 2018-02-20 17:37:03
回答 1查看 24关注 0票数 0

我希望在应用一些异步操作的同时,按照顺序通过多个数组迭代

是否有另一种方法可以获得将在Node中工作的Array迭代器?有什么办法可以让我摆脱这些回调吗?

代码语言:javascript
复制
    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)

    });

}

柱塞

这是预期的输出顺序:

  • pageOne
  • 加载浏览器
  • stateOne
  • 诉讼: stateOne
  • stateTwo
  • 诉讼: stateTwo
  • stateThree
  • 诉讼: stateThree
  • pageTwo
  • 加载浏览器
  • stateOne
  • 诉讼: stateOne
  • stateTwo
  • 诉讼: stateTwo
  • stateThree
  • 诉讼: stateThree

谢谢你的帮助

EN

回答 1

Stack Overflow用户

发布于 2018-02-20 17:45:32

既然你已经标记了你的问题async/await,为什么不直接使用它呢?

代码语言:javascript
复制
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隐式使用。

有什么办法可以让我摆脱这些回调吗?

正确地使用承诺,不要尝试手动推进迭代器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48891136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档