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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

645閲覧

非同期メソッドの終了後に処理をいれたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2018/11/14 08:39

編集2018/11/14 10:53

when apply を使った並列化の記事はよくでてくるのですが
その終了後に同期処理をいれる方法がまったくでてこなくて困っています

function f() { for(let i = 0; i < 10; i++) { var deferredFunc = function(){ return $ajax(...).then( function() {}, function() {} ); }; deferredArray.push(deferredFunc()); } $.when.apply(null, deferredArray).then( function() {}, function() {} ); } f(); console.log('test');

これで最後のメッセージの終了をまってから test を表示するにはどうすればいいんでしょうか

f().then(() => console.log('test'));

でもだめでした

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

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

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

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

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

yambejp

2018/11/14 09:01

省略の方法がいまいちで要領をえません。最低限動くものを表記できませんか?
x_x

2018/11/14 09:04

jQueryのバージョンを記載してください。
退会済みユーザー

退会済みユーザー

2018/11/14 09:08 編集

ajax の戻り処理が別ファイルの巨大なコードになっていて全部はりきれないです javascript は sleep もないみたいだしどうやって非同期をシミュレートする短いサンプルコードを用意すればいいんでしょうか… ajax('google.com') に function を () => null とかにおきかえれば動くとは思いますが一瞬で終わって終了をまててるかどうかはわからない気がします
x_x

2018/11/14 09:16

再現しないです。本当にajaxが一瞬で返ってきているということは?
退会済みユーザー

退会済みユーザー

2018/11/14 09:25 編集

んー 他の人がかいたコードなのでどの処理に時間がかかってるかもよくわかってないんですが、とにかくどこかでデータベースの更新を行っていてそのログが10秒以上流れ続けるんですが console.log だけは一瞬で表示されてしまいます。そのデータベース更新結果を使った処理をかきたいので結果を待ってから実行したいですが… メソッドの中身すべてを理解しないとこの質問内容の構造だけでは終了後に処理をするのは無理なのでしょうか… java や C で fork thread は使ったことがあるんですが中身を理解しなくても join 後に処理をかけばまってくれてたので JS でもできるものかと思って質問したんですが…
退会済みユーザー

退会済みユーザー

2018/11/14 09:40

サンプルコードを動くようにしようと試行錯誤してみたんですが $.ajax がスタンドアロンだとエラーをはくみたいで無理そうです… サンプルがすでに正確なコードじゃないので答えようがないですよね… あまり時間をかけられない案件なのであきらめてデータベースに終了フラグを追加してそれを無限ループでよみにいくようにします コメントしていただいたのに申し訳ありませんでした
guest

回答2

0

一応サンプルだけ

javascript

1<script> 2$(function(){ 3 console.log("start"); 4 var defs=[ 5 $.ajax({url:"test.php",data:{sleep:1},cache:false,}).done(function(data){console.log(3)}), 6 $.ajax({url:"test.php",data:{sleep:2},cache:false,}).done(function(data){console.log(1)}), 7 $.ajax({url:"test.php",data:{sleep:3},cache:false,}).done(function(data){console.log(2)}), 8 ]; 9 $.when.apply(null,defs).done(function(){ 10 console.log("end"); 11 }); 12}); 13</script>
  • test.php

PHP

1<?PHP 2sleep($_GET["sleep"]); 3?>

Promiseが返らなくても

Defferedを複数発行すれば非同期全体をまってくれる(Promise.all)はずですけどね

javascript

1$(function(){ 2 console.log("start"); 3 var defs=Array(3).fill(null).map(function(){return $.Deferred()}); 4 setTimeout(function(){console.log(1);return defs[0].resolve()},3000), 5 setTimeout(function(){console.log(2);return defs[1].resolve()},1000), 6 setTimeout(function(){console.log(3);return defs[2].resolve()},2000), 7 $.when.apply(null,defs).then(function(){ 8 console.log("end"); 9 }); 10});

一連の処理後に更に処理

javascript

1function f() { 2 var d=$.Deferred(); 3 var deferredArray=[]; 4 for(let i = 0; i < 10; i++) { 5 var deferredFunc = function(){ 6 return $.ajax({url:"y.php"}).then(function(){ 7 console.log(i); 8 }); 9 }; 10 deferredArray.push(deferredFunc()); 11 } 12 $.when.apply(null, deferredArray).then(function(){ 13 console.log("end"); 14 d.resolve(); 15 }); 16 return d.promise(); 17} 18f().then(function(){ 19 console.log('test'); 20});

投稿2018/11/14 10:08

編集2018/11/14 11:23
yambejp

総合スコア114775

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

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

退会済みユーザー

退会済みユーザー

2018/11/14 11:08

いまかいていただいてるコードがもとのコードで このさらに後にもう1度処理をいれたかったのですがその方法がわかりませんでした
退会済みユーザー

退会済みユーザー

2018/11/14 12:03

$.Deferred() の return d.promise() というのでプロミスをかえせるのですね resolve をまちたい最後の場所にいれるというのはわかってたんですが new Promise で作って返そうとしててどこにいれたらいいのかがわからず困ってました ありがとうございました
guest

0

ベストアンサー

動くようになったので質問を最初のコードに戻しました

async function f() {
:
await $.when.apply(null, deferredArray).then(...)
}

とかいて

f().then(() => console.log('test'))

とかいたところうまくまってくれるようになりました

async 宣言をすると自動的にプロミスを返してくれるようになるみたいで
そのプロミスが then できるようになるのが
中で書かれてる await が終わってからになるってことなんでしょうか…
まだいまいちよくわかってないですが…

投稿2018/11/14 09:41

編集2018/11/14 10:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yambejp

2018/11/14 11:06

awaitしなくても$.ajaxなら$.whenで処理できるはずですけどね
退会済みユーザー

退会済みユーザー

2018/11/14 11:11

んー ためしに await をとってみたらやっぱり待たずに実行されます というか await を1度もかかない async って何か意味があるんでしょうか 普通に呼び出したときと同じくすぐ終了して then をよべるようになっちゃうんじゃないですか?
yambejp

2018/11/14 11:24

追記しておきました、問題なくうごくと思いますが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問