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.' }