質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

解決済

Redux-Sagaを使用しジェネレーター関数内でyieldをつけているのにどうしても非同期で動作してします。

iBETA
iBETA

総合スコア41

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1回答

0評価

0クリップ

214閲覧

投稿2022/04/08 10:43

なぜかはじめに
FINISH0 が表示され
3秒後に
FINISH1が表示されてしまします
yieldをつけているのに、なぜか非同期で動いてしまっているのです。
どなた様かご教授ください。よろしくお願いします。

JavaScript

import { delay, takeEvery, takeLatest, } from '@redux-saga/core/dist/redux-saga-effects.esm.js'; function* test0(action) { yield put({ type: 'TEST1' }); console.log('FINISH0'); } function* test1(action) { yield delay(3000); console.log('FINISH1'); } export default [ takeEvery('TEST1', test1), takeLatest('TEST0', test0), ];

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

xg63ex2b

2022/04/09 05:40

まだ回答がついていないようでしたのでコメントしてみます。 想定する結果が質問内容からではちょっと理解することができませんでした。 次の内容は参考になりますでしょうか。 > Sagas are implemented as Generator functions that yield objects to the redux-saga middleware. The yielded objects are a kind of instruction to be interpreted by the middleware. When a Promise is yielded to the middleware, the middleware will suspend the Saga until the Promise completes. In the above example, the incrementAsync Saga is suspended until the Promise returned by delay resolves, which will happen after 1 second. > SagasはGenerator関数として実装され、redux-sagaミドルウェアにオブジェクトを引き渡す。生成されたオブジェクトはミドルウェアが解釈する一種の命令です。Promiseがミドルウェアに渡されると、ミドルウェアはPromiseが完了するまでSagaを停止させます。上記の例では、delayが返すPromiseが解決するまでincrementAsync Sagaは中断されます(1秒後)。 > https://redux-saga.js.org/docs/introduction/BeginnerTutorial/ --- > yield 式によって実行が停止されると、ジェネレーターの next() メソッドが呼び出されるまで、ジェネレーターのコード実行は一時停止します。ジェネレーターの next() メソッドが呼ばれるたびに、ジェネレーターの実行が再開され、次のうちのいずれかに達するまで実行されます。 > https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/yield
iBETA

2022/04/11 05:22

自分なりに勝手な判断で理解しました。 なのですが上の文章を読み、またこんがらがってます。 でもジェネレーター関数の中でジェネレーター関数をyieldしない限り いまのところちゃんと動いてはいるのでまあいいのかなと。。。 返事していただいてありがとうございました!! yield 難しいです!!await のほうが理解できますね。
xg63ex2b

2022/04/11 10:16

コメントありがとうございます。 解決したようで良かったです。 私自身、yieldはあまり使わないので詳しくはないのですが、 直接的には非同期(async/await)などとは関係ないと思っています。 yieldすると、次にnextを呼び出されるまでyieldの行で止まっている感じでしょうか。 ですので、質問欄にあるようにyieldの下にログがあると、最初の1回目のログは出力されないことになると思います。 ```js function* generator1(index) { while (index < 10) { yield index++ console.log(`generator1.index : ${index}`) } } const iterator = generator1(0) let result = 0 console.log(`iterator.next 1回目前: ${result}`) result = iterator.next().value console.log(`iterator.next 1回目後: ${result}`) result = iterator.next().value console.log(`iterator.next 2回目後: ${result}`) result = iterator.next().value console.log(`iterator.next 3回目後: ${result}`) // iterator.next 1回目前: 0 // iterator.next 1回目後: 0 // generator1.index : 1 // iterator.next 2回目後: 1 // generator1.index : 2 // iterator.next 3回目後: 2 ``` yieldと非同期が組み合わさるとどうなるのかという話ですが、 それは次の引用に記述されている通りなのかなと理解しています。 > SagasはGenerator関数として実装され、redux-sagaミドルウェアにオブジェクトを引き渡す。生成されたオブジェクトはミドルウェアが解釈する一種の命令です。Promiseがミドルウェアに渡されると、ミドルウェアはPromiseが完了するまでSagaを停止させます。上記の例では、delayが返すPromiseが解決するまでincrementAsync Sagaは中断されます(1秒後)。 > https://redux-saga.js.org/docs/introduction/BeginnerTutorial/
iBETA

2022/04/12 12:45

詳しくかいていただきありがとうございます。 yield難しいですw できることなら使いたくないですかねw

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。