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

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

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

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

Redux

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

JavaScript

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

React.js

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

Q&A

解決済

1回答

413閲覧

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

iBETA

総合スコア43

ECMAScript

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

Redux

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

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2022/04/08 10:43

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

JavaScript

1import { 2 delay, 3 takeEvery, 4 takeLatest, 5} from '@redux-saga/core/dist/redux-saga-effects.esm.js'; 6 7function* test0(action) { 8 yield put({ type: 'TEST1' }); 9 console.log('FINISH0'); 10} 11 12function* test1(action) { 13 yield delay(3000); 14 console.log('FINISH1'); 15} 16 17export default [ 18 takeEvery('TEST1', test1), 19 takeLatest('TEST0', test0), 20];

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

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 のほうが理解できますね。
退会済みユーザー

退会済みユーザー

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
guest

回答1

0

自己解決

そもそもyieldは、非同期の関数を同期で動かす為のものではないことがわかりました。
同期か非同期かはさておき、awaitとは正反対!?的な動きをするのですかね。。。
ジェネレーター関数内でyieldを使い関数を実行しているのですが、
その関数を更にジェネレーター化して中でまたyieldを使う的なことをやってました。
完全には把握できてないですが、こういったことさえしなければ通常通り動きます。
なんで自己解決!?なのかなと。。。

投稿2022/04/11 05:20

iBETA

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問