代码之家  ›  专栏  ›  技术社区  ›  serlingpa

异步:每个函数永远不会完成

  •  1
  • serlingpa  · 技术社区  · 4 年前

    我在试着用 async library

    import { each } from 'async';
    
    let results: any[] = [];
    
    await each(chats, async (chat) =>
        await each(chat.participants, async (participant) => {
    
            console.log('Before pause');
            // do something with participant
            results.push(fn(participant));
            await this.timeout(2500);
            console.log('After pause');
    
          })
    );
    
    console.log('Finished');
    
    return results;
    

    哪里

    let chats = [
      {
        participants: ['1', '2']
      },
      {
        participants: ['3', '4']
      }
    ]
    
    timeout(ms) {
      return new Promise(resolve => setTimeout(resolve, ms));
    }
    

    console.log('Finished') 从不执行。我试过很多不同的方法 async await 但无法使其工作。我有一个使用纯async/await的工作版本,但希望使用异步库。

    我做错什么了?

    请注意,我确实使用了async/await而不使用异步库,如下所示:

    await Promise.all(chats.map(
      async (chat) =>
        await Promise.all(chat.participants
          .map(async (participant) => {
    
            console.log('Before pause');
            // do something with participant
            results.push(fn(participant));
            await this.timeout(2500);
            console.log('After pause');
    
          })
        )
    ));
    
    return results;
    

    0 回复  |  直到 4 年前
        1
  •  1
  •   tony19 steve    4 年前

    each() function(item, callback) {} ,和 callback 需要在每次迭代完成时调用。注意这是不一样的 回拨 作为 每个() .

    await each(chats, async (chat, done1 /*1️⃣*/) => {
    
      await each(chat.participants, async (participant, done2 /*2️⃣*/) => {
        //...
        done2(); /*3️⃣*/
      });
    
      done1(); /*4️⃣*/
    });
    
    console.log("Finished");
    

    demo

        2
  •  0
  •   Frost    4 年前

    试试这个

    let chats = [
      {
        participants: ['1', '2']
      },
      {
        participants: ['3', '4']
      }
    ]
    
    
    chats.forEach(chat =>
         chat.participants.forEach(async (participant) => {
    
            console.log('Before pause');
            // do something with participant
            await timeout(2500);
            console.log('After pause');
            console.log(participant)
    
          }));
    
    function timeout(ms) {
      return new Promise(resolve => setTimeout(resolve, ms));
    }
    console.log('Finished');
    
    

    问题:-

    • 而不是这个。超时,与上下文一起使用或直接在您的案例中使用。进一步了解js中的行为 here & here