#1270 | 2023-12-10 01:22:11

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for-await...of

const sleep = ms => new Promise(res => setTimeout(res, ms))

var asyncIterable = {
  [Symbol.asyncIterator]() {
    return {
      i: 0,
      async next() {
        if (this.i < 3) {
          // return Promise.resolve({ value: this.i++, done: false });
          await sleep(this.i * 1000)
          return { value: this.i++, done: false }
        }
        return { done: true }
        // return Promise.resolve({ done: true });
      },
    };
  },
};

(async function () {
  for await (num of asyncIterable) {
    console.log(num);
  }
})(); // 0 1 2

把 event emitter 改成 for await of 形式:

const EventEmitter = require('events')
const eventEmitter = new EventEmitter()

const sleep = ms => new Promise(res => setTimeout(res, ms))

async function start () {
  const line = 'this is a message.'
  const arr = line.split(' ')
  for (const word of arr) {
    await sleep(word.length * 200)
    eventEmitter.emit('message', word)
  }
  eventEmitter.emit('finish')
}

const asyncWords = {
  [Symbol.asyncIterator]() {
    let finished = false
    eventEmitter.on('finish', () => {
      finished = true
    })
    let value
    let res
    let p = new Promise(resolve => res = resolve)
    const o = {
      async next() {
        if (finished) return { done: true }
        await p
        p = new Promise(resolve => res = resolve)
        return { value, done: false }
      }
    }
    eventEmitter.on('message', msg => {
      value = msg
      res && res()
    })
    return o
  }
}

start()
;(async function () {
  for await (word of asyncWords) {
    console.log({ word })
  }
})();

// { word: 'this' }
// { word: 'is' }
// { word: 'a' }
// { word: 'message.' }