0

Так как упреждающая многозадачность недоступна в браузере, а JavaScript по сути является однопоточным, то как промежуточное ПО Redux, такое как redux-сага, обрабатывает бесконечные циклы, не предназначенные для совместной многозадачности, не запуская длительный диалог сценариев?Как многозадачность достигается в промежуточном ПО Redux?

function* watchSaga() { 
    while (true) { 
     yield take(SOME_REQUEST); 
     // do something 
    } 
} 

Редактировать

Мое заявление "не предназначен для кооперативной многозадачности" было неправильно. Код функции генератора выполняется только до первого выражение.

ответ

1

yield действительно является ключом, так как он дает управление, suspending the current generator function and returning a value to it.

Простой пример:

function* counter() { 
 
    console.log('Running generator to first yield point'); 
 
    var x = 0; 
 
    do { 
 
    console.log('About to increment and yield control'); 
 
    yield ++x; 
 
    console.log('Running counter to next yield point - x is currently', x); 
 
    } while (true); 
 
} 
 

 
console.log('Instantiating generator'); 
 
var instance = counter(); 
 
console.log('Generator instantiated, calling for the first time'); 
 
console.log('The first entry in counter is', instance.next()); 
 
console.log('The second entry in counter is', instance.next()); 
 
console.log('The third entry in counter is', instance.next()); 
 
console.log('The program continues running');

2

Это в то время не является бесконечный цикл, это генератор https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators.

Ключевое слово yield выходит из функции, но его состояние, включая последнюю выполненную строку, остается до следующего вызова функции, когда она перезапускается в инструкции, следующей за последней выполненной строкой, до тех пор, пока не увидит ключевое слово yield снова.