0

return fetch(url, {
    credentials: 'same-origin',
    ...options
  })
  .then(response => response.json())
  .then(function*(response) {
    console.log("httpStatusCode", response.httpStatusCode)
  })

上記は可能ですか?コールバック関数がジェネレーターの場合、コンソール出力が得られません。これは、コントロールがコールバック関数 (ジェネレーター) に渡されていないことを意味します。このようにしたい本当の理由は、ジェネレーター関数からのみ呼び出すことができる上記のコールバックから redux-saga の「call」ヘルパー関数を使用して、別のフェッチ要求を呼び出す必要があるためです。

4

3 に答える 3

2

上記は可能ですか?

いいえ。thenメソッドは単にジェネレーター関数を呼び出してジェネレーターを作成しますが、それを破棄して、チェーンされた約束を実行し、それを進めません。ジェネレーターを使用したいときはいつでも、実際にそれらを実行するものが必要です。

このようにしたい本当の理由は、上記のコールバックから redux-saga の「call」ヘルパー関数を使用して別のフェッチ要求を呼び出す必要があるためです。これは、ジェネレーター関数からのみ呼び出すことができます。

いいえ。call任意のジェネレーター関数から呼び出す必要はありません。redux-saga で使用されるyieldジェネレータcall()関数からと を呼び出すことができます。

いずれにしても、コードは次のようになります。

let response = yield take(fetch(url, {
    credentials: 'same-origin',
    ...options
}));
response = yield take(response.json());
console.log("httpStatusCode", response.httpStatusCode)
于 2016-08-04T07:05:59.950 に答える
2

私はあなたができると思います。ジェネレーター関数が実行されると、ジェネレーター オブジェクトが生成され、ジェネレーターを開始できる次のステージに渡されます。どれどれ...

var pr = Promise.resolve(42);
pr.then(function*(n){ yield n; yield n / 2; yield 37})
  .then(it => {console.log(it.next().value);
               console.log(it.next().value);
               console.log(it.next().value);
              });

于 2016-08-04T07:17:31.373 に答える
0

ここでロングショットを撮ります。ジェネレーター関数を反復するには、「gen.next()」を呼び出せる必要があります。「.then」に無名関数を提供した後では、これは不可能です。

私はredux-sagaに精通していませんが、私が理解していることから、似たようなことを試してみてください.

function response (data) {
   console.log("httpStatusCode", data.httpStatusCode);
}


fetch(url, {...})
   .then(function (d) {
      var gen = response(d);
   })

genその後、redux-saga で使用するために渡すことができます。

于 2016-08-04T07:13:58.897 に答える