web-dev-qa-db-ja.com

JS:コールバックでジェネレーターとyieldを使用する方法

JSジェネレーターを使用して、setTimeoutのコールバックで値を生成します。

function* sleep() {
  // Using yield here is OK
  // yield 5; 
  setTimeout(function() {
    // Using yield here will throw error
    yield 5;
  }, 5000);
}

// sync
const sleepTime = sleep().next()

ジェネレーターのコールバック内で値を生成できないのはなぜですか?

14
李岡諭

_function*_ 宣言は同期的です。新しいPromiseオブジェクトを生成し、.then().next().valueにチェーンして、解決されたPromise値を取得できます。

_function* sleep() {
  yield new Promise(resolve => {
    setTimeout(() => {
      resolve(5);
    }, 5000);
  })
}

// sync
const sleepTime = sleep().next().value
  .then(n => console(n))
  .catch(e => console.error(e));
_
13
guest271314