Почему setTimeout ведет себя так в моей реализации потока? - PullRequest
0 голосов
/ 16 сентября 2018

Последняя строка этого кода успешно вызывает метод _read настраиваемого дуплексного потока в узле.

const timeContext = new TimeContext(sampleRate);
const input = new InputStream(timeContext); // Stream.Readable
const throttle = new Throttle(sampleRate); // Stream.Transform

const stackSource = [];

const stack = new StackStream(stackSource); // Stream.Duplex

input.pipe(throttle).pipe(stack);

stack.read(); // This will call the _read method of StackStream

При добавлении setTimeout для задержки вызова stream.read () обратный вызов setTimeout НЕ вызывается:

const timeContext = new TimeContext(sampleRate);
const input = new InputStream(timeContext); // Stream.Readable
const throttle = new Throttle(sampleRate); // Stream.Transform

const stackSource = [];

const stack = new StackStream(stackSource); // Stack.Duplex

input.pipe(throttle).pipe(stack);

setTimeout(() => {
    stack.read(); // This callback never gets called
}, 1000);

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Похоже, функция read () является локальным свойством стекового объекта, и setTimeout не может увидеть это локальное свойство стекового объекта.Вот почему он ведет себя таким образом.

См. Это решение для справки,

https://stackoverflow.com/a/4536268/10371717

0 голосов
/ 16 сентября 2018

Он определенно вызывается, но что-то еще вызывает ошибку

setTimeout(() => {
    console.log('We got here');
    stack.read(); // This is what is crashing in your code
    console.log('We don\'t get here');
}, 1000);

Это не так, как вы ожидаете, потому что происходит какая-то другая ошибка.Посмотрите в консоли, чтобы увидеть, какие ошибки возникают.

...