- 1 名前:デフォルトの名無しさん mailto:sage [2016/05/22(日) 19:51:33.37 ID:WwOYSBmy.net]
- JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-4のテンプレを読んだ上で質問してください。次スレは>>950が>>2のテンプレ案(本スレで改善案があれば考慮)を元に立ててください ■質問を書く上で (1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。 (2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。 (ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など) (3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。 (4) 常に自発的に調べる心構えを持ってください。 具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。 わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。 (5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。 (6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。 ※必ず「問題の事象が再現されること」を確認してください。 必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。 (7) サンプルコードに HTML が含まれる場合は validator.w3.org/ で [Check] してみてください。 (8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2の質問テンプレートを活用してみてください。 (9) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。
- 684 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 18:07:30.48 ID:dYSnVaKQ.net]
- あなたの主張はわかった。
=> でもそれは間違ってる => 私が間違っていた => あなたも正しいが、私の主張も正しい のどれだろうか。
- 685 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 18:47:33.56 ID:9x/TacpJ.net]
- >>665
無知を省みて自分の至らぬ所を認め、その上で正しい知識を入れ直さないと、 技術者として致命的な場面がやってくるよ。 匿名で出来る間にやっておけばいかがかな。
- 686 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 19:35:30.53 ID:TG3hSyiU.net]
- 一般論からは、複製するオブジェクトを利用している文脈に固有のデータは
複製されない方がよいだろう(一時的な管理データなど よって、何を複製すべきかは複製した結果を利用する文脈に依存する 元と同じ文脈で利用する場合でも、すべてのデータを複製した方が いいとは限らない( id みたいに重複すると困るものなど
- 687 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 22:10:43.05 ID:VJ/4c5wE.net]
- ディープコピーは滅多に使わないな
マップした結果が偶々ディープコピーと同じ結果になる事はあるけど 転送はJsonXmlバイナリのどれかのシリアライズだし
- 688 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 23:14:40.87 ID:9x/TacpJ.net]
- 一般論としては、ってのがよくわからんが、そんなものをデータに持ち込むからじゃないの?
- 689 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 23:28:10.46 ID:M6DJWkXG.net]
- ディープコピーとシリアライズは別の機能。
ディープコピーにシリアライズ用の関数を使うのは間違い。 それだけの話だろ
- 690 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 00:12:34.59 ID:cIXZs8w1.net]
- >>671
そりゃおっしゃる通り。 一番元々の要件に対して、「手軽で早い」解決策。 そこから、変なものをdeepcopyだと寝言言う奴があらわれてこうなっただけ。 cloneとequalsを定義すべきだと思うよ。「正しい実装」では。
- 691 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 00:19:47.28 ID:wTcNi+2O.net]
- >>672
もともとの要件? もともとの要件は、ディープコピーなんだが?w ディープコピーにシリアライズ用の関数を使うのは間違いって JSONつかってやるコードを持ち出してきた >>661をぎったんぎったんに叩いてやれよw ↓しっかり思い出せやw 608 自分:デフォルトの名無しさん[sage] 投稿日:2016/06/12(日) 23:34:06.35 ID:xguVhByI [2/2] shallowコピーの場合はconcatでいいよね。 最初は?ってなるけど、知ってしまえば簡単に覚えられるし。 なんらかのdeepコピーの場合はライブラリ使うしか無いかな? 611 返信:デフォルトの名無しさん[sage] 投稿日:2016/06/12(日) 23:57:34.48 ID:hCgFiHr7 [7/7] >>608 JSON.parse(JSON.stringify(obj)) が、一番手軽で早い。
- 692 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 01:25:24.86 ID:Iz/1ukPU.net]
- ディープコピーといっても様々じゃない?
構造下のオブジェクトは再作成することになるが、 関数に限ってはクロージャの面からも参照コピーした方がいい。 しかしそうなると関数オブジェクトのプロパティの取り回しが困る。 他にも非列挙やシンボルの扱いもあるし一般的に何が正しいかなんてない。
- 693 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 02:03:52.98 ID:wTcNi+2O.net]
- >>674
例えそうだとしても日付が壊れるとか undefinedが消えるだとかいうのは問題外
- 694 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 04:32:57.44 ID:Iz/1ukPU.net]
- そっとしてそれはギャグで言ってるのかな?
- 695 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 08:08:29.44 ID:SSaOcc+i.net]
- >>673
ディープコピー全体に対して、すべてをシリアライズで解決するのは正しいか間違いか、 って話であって、 少なくともconcat使うような配列やらなんやらでは、シリアライズで必要十分だねと。 訳わからん前提を持ち出して、あまつさえディープコピーではないものをディープコピーと言い出した奴は気が狂ってると思うけど。 だから、何度かclone/equalsの話もしてんじゃん。 お前、自分が何故叩かれたか理解してないの? >>675 そんな形で持つからだろ。
- 696 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 08:56:16.37 ID:FEVYup+X.net]
- javascript業界は素人ばっかりだな
参照型のディープコピーの実装は大きく分けて3つ プロパティの自動マッピング、シリアライズ、明示的なコピー関数 実行効率や制約の多さはともかくとして工数的にはシリアライズを利用する方法は有力な選択肢だよ もちろんそもそも論としてディープコピーなんかそんなに使わないってのがあるけどね
- 697 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 09:05:04.59 ID:wTcNi+2O.net]
- > 参照型のディープコピーの実装は大きく分けて3つ
> プロパティの自動マッピング、シリアライズ、明示的なコピー関数 オレオレ定義すんなよ。 見苦しいんだよ。
- 698 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 09:08:01.05 ID:wTcNi+2O.net]
- > 工数的には
どこぞのライブラリを使えばいい。
- 699 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 11:46:17.65 ID:SSaOcc+i.net]
- >>679
これ、オレオレ定義か? CoRしたいなら1つめ、あとはごく当たり前な実装だと思うけど。
- 700 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 13:00:32.42 ID:RkIC2p5j.net]
- >>681
一般にディープコピーするのにシリアライズは必要ないんじゃない? 無駄な処理を挟んでいるだけに見える
- 701 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 13:11:48.27 ID:SSaOcc+i.net]
- >>682
javascriptみたいな、オブジェクトのプロパティの型がプリミティブだって保証が無い言語で、 制限事項少なめで一発でコピーするには楽だと思うけどなぁ。
- 702 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 13:37:00.47 ID:RkIC2p5j.net]
- >>683
JavaScriptの場合、JSONが楽に実装できることは否定しないよ サーバにデータを送るならシリアライズする意味はあるけど、ディープコピーする為だけにシリアライズする必要はないってだけ シリアライズしたフォーマット(JSON)の制約を受けるわけだし、シリアライズする時点で目的と手段が一致してないように見える Object.keysやfor-ofで列挙したキーを順番にコピーしていく方がどう考えても制約が少ない
- 703 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 14:34:35.52 ID:KXw+rbZw.net]
- なんかディープコピーはあれもこれもちゃんとして超完璧じゃないといけないみたいな人がいるけど
どのライブラリとってみてもそれなりな実装しかしてないんだよね。 >>684とか制約が少ない(キリッ って言うけどそこまでしてその制約の少なさを求める妥当性を一切言わない。
- 704 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 15:00:16.56 ID:RkIC2p5j.net]
- >>685
「制約が少ない」は>>683の「制限事項少なめ」に反論しただけ 上の方で「ディープコピーじゃないよ」云々の人がいたし、ディープコピーのクオリティを向上させる流れだと思ったんだけどね それなりの実装でいいなら各々が自分の好きなように実装すればいいし、他人の実装を否定する必要もないね
- 705 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 15:03:11.81 ID:KXw+rbZw.net]
- どんだけ頑張ってもそれなりの実装にしかならないから決め手がなくて問題なんでしょ。
- 706 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 15:39:36.39 ID:SSaOcc+i.net]
- >>684
for ofで、オブジェクトなら再帰的に、とやると、今度は参照が循環してしまった場合に備えて、メモ化する必要が出てきたりと、制限事項を制限事項とするためにとても面倒な段取りを踏まないといかんのよ。 そういう意味では、やっぱりインスタンス各自に任せるのが一番なのかもしれんよ。 cloneを必ず実装して、その中の実装でも、どんなオブジェクトも自力ではコピーせずに、cloneを呼び出すようにして、呼び出せるcloneが無い場合、死ぬかないしは参照のコピーとなる可能性があるとワーニング吐くとくとか。 .toJSON実装しときゃstringifyだと割と解決するんだけどね。
- 707 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 15:42:17.53 ID:TAanDQJ+.net]
- >>684
ディープコピーの実装する為だけに面倒くさいだけのツマラナイコード書く必要なくね? シリアライズでサッサと済ませればいいじゃん
- 708 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 16:25:26.27 ID:RkIC2p5j.net]
- >>688
> for ofで、オブジェクトな
- 709 名前:迯ト帰的に、とやると、今度は参照が循環してしまった場合に備えて、メモ化する必要が出てきたりと、制限事項を制限事項とするためにとても面倒な段取りを踏まないといかんのよ。
なるほど、参照をメモ化すれば循環参照を保持出来るね オブジェクトの配列をメモ化しておいてArray#indexOfで探せばいいので比較的簡単に実装できそう JSON.stringifyを使ったら循環参照を消してた var obj = {a:{x:1},b:obj,c:this.a}; JSON.stringify(obj); // "{"a":{"x":1}}" toJSONを使ってユニークな文字を出力しても解決できそうにないかな ユニークな文字列と同値が存在したら破綻するし、渡すオブジェクト自身に循環参照していた場合、obj.toJSONを定義した途端にJSON.stringify(obj)が文字列になってしまう この辺がJSONの限界かな [] - [ここ壊れてます]
- 710 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 17:24:42.09 ID:uCNYQdtw.net]
- 一日中こんなところでくだらん連投して何が楽しいの?
仕事でも探せば?
- 711 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 17:35:48.15 ID:SSaOcc+i.net]
- >>690
そうそう。 すでにクローン済みとメモ化するにも、ネストしたオブジェクトの底の方で発見したオブジェクトと、浅い所で発見したオブジェクトに対して、再起だと上にメモを返してやらないと、同一参照にはならんので、割とめんどくさいと思うよ。 吹き飛ばすのが一番、かつ、そんなデータを作らないのが一番と言う所に落ち着くんじゃないかな。
- 712 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 18:40:06.70 ID:kCCRbfye.net]
- 一番面倒なのは外部プロパティに加え内部プロパティを持ったビルトインコンストラクタのインスタンスだろう。
それを複製するにはそれぞれのクラスごとに対応しないといけないし、その最たるものである関数は対処不能。 >>690 ちょっと工夫すればJSON APIを活用しつつも循環参照も扱える >>656みたいに(バグあり)
- 713 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 23:17:16.03 ID:wTcNi+2O.net]
- >>689
> シリアライズでサッサと済ませればいいじゃん だから、その結果、日付型がおかしくなり関数が消え undefinedの値がキーごとなくなるのはひどすぎという話。
- 714 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 07:45:47.42 ID:oMjTOMdB.net]
- それで十分な場面はそうでない場面よりずっと多いと思うので、
酷いか酷くないかで言うと酷くないと思う。
- 715 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 09:28:45.12 ID:J7Y57E8z.net]
- >>694
何でもかんでも汎用化しようとするのはヴァカのやる事だし そもそも込み入った形式のオブジェクトをディープコピーする機会は少ない 適用可能な範囲で簡単に実装できるならそうしたほうがいい できない範囲にはポリモーフィックに対応すればいい
- 716 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 09:30:35.19 ID:u57UUEr0.net]
- >>696
日付型や関数はundefinedが値として入っているのは ぜんぜん込み入った形式じゃないですよ?
- 717 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 12:30:42.86 ID:TTOq9A9Q.net]
- >>697
設計が悪いだろ。そりゃデータとロジックが分離できてないとしか言いようが無くないか?
- 718 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 15:06:47.71 ID:peThILAI.net]
- ディープコピー使ったコードも8割方設計がまずい気がする
- 719 名前:デフォルトの名無しさん [2016/06/16(木) 19:02:21.99 ID:ykd7wui8.net]
- iOS9のSafariでWebを見た時、リーダーが使えず
以下のURLを参考にフォントを拡大して使っています。 iOSのSafariで表示してるページの文字の大きさを自由に変更しよう! mag.torumade.nu/?p=7260 ここにあるJavaScriptの+/ーそれぞれの記述ですが、 フォントを多きく/小さくしている箇所は何処でしょうか? 今は2,3回ポチって文字を大きくしています。 出来ればポチったら一発で好みの文字の大きさにするスクリプトにしたいです。 JavaScriptで文字の大きさを買えるのに、試行するのは構いませんので 宜しくお願いします。 JavaScriptは書いたこと無いので、ここでの記述をコピペになると思います。
- 720 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 21:35:26.83 ID:DYttMfqr.net]
- めんどくさいしこれでいいよ
まともな造りしてればまあ読めるだろ 大きさ変えたいなら 20px を好きな値にしな javascript:document.body.innerHTML+='%3Cstyle%3E*%7Bfont-size:20px!important%7D%3C/style%3E';
- 721 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 22:07:33.10 ID:u57UUEr0.net]
- >>698
> 設計が悪いだろ。そりゃデータとロジックが分離できてないとしか言いようが無くないか? 日付やundefinedはデータですよ? これをロジックと言い張る人、初めて見たわーwww
- 722 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:16:54.38 ID:XW0r+pFS.net]
- >>702
関数、に言ってるんだけど。 とにかく言い負かされたくなくて必死なんだな。 あと、undefinedは正確にはデータではなく、状態。 日付は、日付。Dateクラスは、日付を扱うためのクラスであり、日付の値では無い、あくまで値は、.valueOf()で取得できる値。 ババロア君は馬鹿か無知かどちらかにしとけよ。ババロアすら詰まってないんじゃねえの?
- 723 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:31:17.80 ID:gkJjvuAc.net]
- >>703
なんで3つのうち関数にしか言わないの? 残り2つは反論できませんって話かwww
- 724 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:33:59.24 ID:gkJjvuAc.net]
- "abc".bold() って実行してみ?
文字列は
- 725 名前:クラスだって知らないのかな?www []
- [ここ壊れてます]
- 726 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:46:16.36 ID:XW0r+pFS.net]
- >>704
2つはその、下で反論してるけど。 文字も読めないの? >>705 .valueOf実行してみ。 薄いラッパーに包まれたただの値だとわかるよ。
- 727 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:47:44.33 ID:XW0r+pFS.net]
- >>705
プロトタイプに実装されてるか、それともインスタンスに実装したのかも分けて考えような、ボンクラ。
- 728 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 01:18:50.68 ID:gkJjvuAc.net]
- >>706
日付.valueOf実行してみ。 薄いラッパーに包まれたただの値だとわかるよ。
- 729 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 01:20:43.01 ID:gkJjvuAc.net]
- >>707
> プロトタイプに実装されてるか String.prototype.hoge = function() {} と定義したものが "abc".hoge() で呼び出されるな。 プロトタイプに実装されてるわけか。
- 730 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 01:38:53.96 ID:MlF9RYHU.net]
- プリミティブ型とラッパーオブジェクトは別物だから明確に区別しとかないと事故るぞ
例えば以下の様なケース if(new Boolean(false) && new Number(0)){ //どちらもオブジェクトが存在するのでtrue //よってここは常に実行される } if(false || 0){ //どちらもプリミティブでfalseとして扱われる値 //よってこちらは実行されない }
- 731 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 02:49:55.65 ID:bQl7rsTf.net]
- >>701
ありがとうございました。
- 732 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 09:31:42.05 ID:srh2csoY.net]
- >>710
いろんなJS質問スレ見てきてるが半年ぶりくらいに まともな初心者解説のコードが書かれたな。
- 733 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 16:34:23.27 ID:6iHig3Yk.net]
- ゴミが持論書きなぐってるだけのクソスレに何を期待してるの?
- 734 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 17:12:33.16 ID:BB7ZCZit.net]
- 動画サイトだけ自動でCSSを切り替えるために、動的に挿入されたiframe, video, object, embed エレメントを検出したいんですが、効率的な方法が思い浮かばず困っています
iframeとvideoはdocumentでイベントリスナ(load, loadedmetadata)すれば検出できるんですが、なぜかobjectとembedちゃんからのお便りが来ません(chrome ver51) とりあえず暫定的にクリック毎にgetElementsByTagName()で代替しているんですが、 何かもっとスマートな方法ないでしょうか
- 735 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 19:02:26.08 ID:Rqj2POSn.net]
- MutationObserverで逐一tagName調べるのが無難かな
- 736 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 19:29:30.69 ID:BB7ZCZit.net]
- >>715
動画サイトの場合、オプション{childList true, subTree: true}でノード追加を監視すると、コンソールが常時ナイアガラの滝のように・・・
- 737 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 19:41:50.28 ID:nZkVhJBc.net]
- >>713
その通りだね 俺様流カレーライスの作り方みたいなもんだよねw
- 738 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 02:23:30.51 ID:zfC6EzMS.net]
- >>717
その俺様流カレーライスの作り方で、ドヤ顔でハヤシライスの作り方説明して、これが「妥当なカレーライス」とか言っちゃうような俺流deepcopyerが 主みたいなスレだからね。 まともな奴はレスしなくなるっしょw
- 739 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 09:38:41.31 ID:Fpexe9SW.net]
- ハヤシライスというより肉じゃがだと思う
- 740 名前:デフォルトの名無しさん mailto:!sage [2016/06/18(土) 09:43:04.22 ID:pG9pCEms.net]
- "a,b,c".split(",",1)で、
["a","b,c"]を取得したいのですが、["a","b"]になります どうすrばいいですか
- 741 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 10:53:48.22 ID:49KWKmmu.net]
- <input id="a" type="text">
document.getElementById('a').addEventListener('input', function(e) { console.log(e); }, false); enterキーを押した時だけログがでないんですがどうしてですか?
- 742 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:22:34.63 ID:z24FpIHh.net]
- function test1() {
return new Promise(function(resolve, reject) { // 非同期な処理 }; } function test2() { return new Promise(function(resolve, reject) { // 非同期な処理 }; } 上記の関数を逐次実行したい場合、 Promise.resolve() .then(() => { let promise = test1(); promise.then(() => { console.log('test1 OK'); }).catch(function(e){ console.log('test 1NG'); }); return promise; }) .then(() => { let promise = test2(); promise.then(() => { console.log('test2 OK'); }).catch(function(e){ console.log('test2 NG'); }); return promise; }) }); って書くってことであっていますか?意図通り動くのですが、回りくどいし見にくい気がして
- 743 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:28:02.54 ID:z24FpIHh.net]
- >>721
document.getElementById('a').addEventListener('keydown', function(e) { console.log(e); }, false); keydown にすればenterも拾える
- 744 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:30:40.39 ID:qpxG5nAO.net]
- >>722
そんなわけなかろうw いまゲームしてるからちょっと待てwww
- 745 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:32:40.70 ID:z24FpIHh.net]
- >>720
splitだけでその配列を取得するのは無理
- 746 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:33:55.65 ID:z24FpIHh.net]
- >>724
お、ありがとうございます たのんます
- 747 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:40:53.70 ID:lYop9Jcb.net]
- >>720
それ戻り値["a"]じゃね? とりあえず脳内補正で第二引数は2だとするとjavascriptのsplitだとその希望の動作にはならない 第二引数なしでsplitして[t[0],t.slice(1).join(',')]とか indexOfとsubstring組み合わせて自分で切り出すとか 他にも色々やり方はあるので要求に合った方法を考えて関数化しとけばいいよ
- 748 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:48:58.73 ID:7whaN/tJ.net]
- >>720
indexOfでインデックスを取得してslice
- 749 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:49:03.57 ID:z24FpIHh.net]
- 722ですがこっちですかね、余計見にくいような気もしますが(アロー演算子のせい?)
test1().then(() => { return test2(); }, () => { console.log('1のNG'); }).then(() => { // 1 も 2 も成功 }, () => { console.log('2のNG'); }).catch(function(e){ console.log('ここにはいつくるんだろう?'); });
- 750 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:52:05.82 ID:ousMayNp.net]
- >>722
thenの結果は自動でプロミスに変換されるから、function test2 のなかでプロミスを作らなくておk シンプルにfunction test2(previousResult) { // 非同期な処理 return resTest2} としておいて test1 .catch(resTest1 => resCatch1) .then(test2) .catch(resTest2 => resCatch2) 〜 とつなげればいい 一個目のcatchを省略した場合、 test1でエラーが起きると最後のキャッチにジャンプする
- 751 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:54:20.50 ID:7whaN/tJ.net]
- >>721
可能性はいくつかある - input要素で [Enter] キーを押している - IME変換時に [Enter] キー
- 752 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:56:06.15 ID:ousMayNp.net]
- >>729
thenの第二引数をcatchとして使うと、そのthenで起きたエラーは拾わなあいから、必要ないときはcatchを使ったほうがいいよ 分かり易いから
- 753 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:56:58.21 ID:qpxG5nAO.net]
- >>729
ほらよ。ついでに値の渡し方も書いておいたぞ。 thenの戻り値としてPromiseではないものを返せるところにも注意な。(return textの所) あと、最初はPromise.resolveで始めなくても、いきなりtext1("sample").then でも良い。 function test1(text) { return Promise.resolve(text); //return Promise.reject(text); } function test2(text) { return Promise.resolve(text); //return Promise.reject(text); } Promise.resolve("sample") .then(text => test1(text)) .then(text => { console.log("test 1 OK:" + text); return text; }) .catch(text => { console.log("test 1 NG:" + text); return text; }) .then(text => test2(text)) .then(text => { console.log("test 2 OK:" + text); }) .catch(text => { console.log("test 2 NG:" + text); });
- 754 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:06:33.76 ID:qpxG5nAO.net]
- ただ、一直線に書くとtext1とtext2の
- 755 名前:範囲なのかわかりづらいから
>>722を少し改良したこれでもいい気もしてきたな。 Promise.resolve("sample") .then(text => test1(text) .then(text => { console.log("test 1 OK:" + text); return text; }) .catch(text => { console.log("test 1 NG:" + text); return text; }) ) .then(text => test2(text) .then(text => { console.log("test 2 OK:" + text); }) .catch(text => { console.log("test 2 NG:" + text); }) ); [] - [ここ壊れてます]
- 756 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:09:27.96 ID:qpxG5nAO.net]
- なお、もちろんこう書くこともできるし
function test1(text) { let p = Promise.resolve(text); //let p = Promise.reject(text); return p.then(text => { console.log("test 1 OK:" + text); return text; }) .catch(text => { console.log("test 1 NG:" + text); return text; }); } function test2(text) { let p = Promise.resolve(text); //let p = Promise.reject(text); return p.then(text => { console.log("test 2 OK:" + text); return text; }) .catch(text => { console.log("test 2 NG:" + text); return text; }); } Promise.resolve("sample") .then(text => test1(text)) .then(text => test2(text));
- 757 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:18:57.19 ID:qpxG5nAO.net]
- catchをthenの機能に含めて、こういう書き方もできる。
Promise.resolve("sample") .then(text => test1(text)) .then(text => { console.log("test 1 OK:" + text); return text; }, text => { console.log("test 1 NG:" + text); return text; }) .then(text => test2(text)) .then(text => { console.log("test 2 OK:" + text); }, text => { console.log("test 2 NG:" + text); });
- 758 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:27:30.76 ID:lYop9Jcb.net]
- >>729
まずtest1とtest2の中の非同期でresolve(戻り値)またはreject(エラーの原因)を呼んでる事は前提とすると function err(e){console.error(e);}; function finish(val){console.info("終了",val);}; test1().then(test2).then(finish).catch(err); thenで第二引数を渡さなければrejectもcatchに飛ぶのでこれで充分なはずだけど?
- 759 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:30:46.97 ID:qpxG5nAO.net]
- .then(text => test1(text)) は
.then(test1) これでよかったな。
- 760 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:38:51.52 ID:qpxG5nAO.net]
- 他にもいろいろ書き換えてみたけど、これが俺の中でベストかな
Promise.resolve("sample") .then(test1) .then(text => { console.log("test 1 OK:" + text); return text; }, text => { console.log("test 1 NG:" + text); return text; } ) .then(test2) .then(text => { console.log("test 2 OK:" + text); }, text => { console.log("test 2 NG:" + text); } );
- 761 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:51:32.54 ID:z24FpIHh.net]
- 皆さんありがとうございます。
まだ若干こんがらがってますが、理解がだいぶマシになりました。 test2はプロミスにしなくてOKということですが、 test2を単独で使用する可能性がある場合は今のままでも大丈夫ですよね...?
- 762 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:52:59.75 ID:z24FpIHh.net]
- 皆さんのを参考に
function test1(text) { return new Promise(function(resolve, reject) { setTimeout(() => { reject(text); }, 1000); }); } function test2(text) { return Promise.resolve(text); } Promise.resolve("sample") test1("test") .then(text => { console.log("test 1 ok " + text); return text; }, text => { console.log("test 1 ng " + text); return text; }) .then(test2) .then(text => { console.log("test 2 ok " + text); }) .catch(text => { console.log("test 2 ng " + text); }); こういうのを書いてみたのですが、 test1でrejectしてもそのままtest2に入ってきましたが、これはこういうものでしょうか?
- 763 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:54:43.38 ID:z24FpIHh.net]
- すみません、>>741の Promise.resolve("sample")は不要ですね
- 764 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 15:02:45.38 ID:qpxG5nAO.net]
- >>741
> test1でrejectしてもそのままtest2に入ってきましたが、これはこういうものでしょうか? あれ?そういう仕様だと思ってたよw じゃあ書き換えが必要だね。 いまゲームしてるから(ry
- 765 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 15:15:57.87 ID:HfDVf1Az.net]
- >>741
www.html5rocks.com/ja/tutorials/es6/promises/
- 766 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 15:28:56.46 ID:z24FpIHh.net]
- 何度もすみません。
>>743-744 ありがとうございます、そのサイト見てたはずですが見落としていました だいたい理解できました。 一連の質問は解決ということで問題ないです。 皆さんありがとうございました。
- 767 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 23:31:55.96 ID:aNvZce14.net]
- imeオンオフに関わらずEnterキーが入力されたか確認する方法を教えてください
- 768 名前:デフォルトの名無しさん mailto:sage [2016/06/19(日) 01:39:49.43 ID:XpUIM/8a.net]
- >>746
IME周りはブラウザ毎に実装が違ったりして面倒なので全てのブラウザで動くとは保証出来んが keydownでキーコード229,0,13を拾えばだいたい拾えるんじゃないかね?
- 769 名前:デフォルトの名無しさん mailto:sage [2016/06/19(日) 01:54:37.93 ID:jkRTuMFS.net]
- おしんとひこうきぴゅんぴゅん
- 770 名前:デフォルトの名無しさん mailto:sage [2016/06/19(日) 15:42:45.26 ID:j/5yp6z/.net]
- 古いソフトのプラグイン頼まれたんだけど新しめのESで追加された機能がほとんど使えなくて難儀してる
よくわからないんだけどこういうのって作者が対応すれば使えるようになるの? VSなんかだと参照突っ込むだけで機能使えるようになるけど そういうお手軽はお話じゃないんかね
- 771 名前:デフォルトの名無しさん mailto:sage [2016/06/19(日) 19:29:55.99 ID:fmRoj+h3.net]
- なんのエンジン使ってるか知らんが例えばV8でも無理でーす
奴らは自分のブラウザで動けばいいので毎日のように互換性壊しまくりのスケ〜
- 772 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 18:11:29.60 ID:tys3WiX6.net]
- javaでいうTreeSetを使いたいのですが、ありますか?
- 773 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 18:48:32.16 ID:hRWj67CX.net]
- (非数字)文字列ならオブジェクトのプロパティとして加えていって列挙すればソートされてる
- 774 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 00:26:47.70 ID:qdV120KE.net]
- リンクをクリックするとJavaScriptでページ遷移するウェブページで、遷移する先のURLを事前に取得する方法はありますか?
意図としてはページに飛ばされる前にどこに飛ぶのか判断したいためです。
- 775 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 00:47:36.70 ID:Zouo8B6w.net]
- >>753
JavaScriptでページ遷移するなら遷移先URLもJavaScriptで分かっているはずなのだが
- 776 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 08:14:40.47 ID:vlWZNI1X.net]
- >>754
最終的な遷移先のURLを鯖側で生成してたらわからんけど
- 777 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 09:06:55.19 ID:zhgdBgoI.net]
- >>754
説明が足らずすみません。 他者が作ったウェブサイトの環境で、ブラウザの拡張機能などで自前のJavaScriptを実行して判断したいということでした。 そういうことだと>>755さんの言うとおり、他者のサーバで生成してるからわからないってことになりそうですね。
- 778 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 11:17:04.95 ID:Zouo8B6w.net]
- >>756
URLの生成規則を探すとか、JavaScriptコードを読んでコードから遷移先URLを得る、とか一概には言えないと思う
- 779 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 12:14:28.77 ID:VoVagir1.net]
- >>756
クライアントが移動先を知ってるなら取る方法はない訳ではないが 鯖側でリダイレクトさせる場合にはAjaxでリンクを踏んで戻った内容からリダイレクト先をスクレイピングするとかしないと無理だろうね つまり画面遷移をせずにリンク先を取得する事は可能、鯖と通信せずにリンク先を取得する事は不可能なケースがある クライアント上で動作している以上、クライアントが知らない情報は取得出来ない
- 780 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 13:29:33.82 ID:NcocGzZA.net]
- いや、どこに跳ぶかを判断したいくらいなのだから、
いろんな方法・想定で常識的な範囲で全て判断できると言えるだろう
- 781 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 19:00:28.03 ID:s0xSal8K.net]
- VBのFormsみたいなフレームワークってないすか?
デザイナでペタペタ配置してロジックは画面オブジェクトにハンドラを書くだけ的なやつです
- 782 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 19:02:39.48 ID:rJ2mr4JY.net]
- >>760
ホームページビルダで出来ない? 使ったことないから知らんが
- 783 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 20:02:34.86 ID:zhgdBgoI.net]
- >>757
>>758 丁寧に回答していただきありがとうございます。 リンククリック時のJavaScriptからレスポンスを解析してURLを取得できるかを試してみます。
- 784 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 22:07:52.39 ID:8xYufxWO.net]
- var fs = require('fs');
var data = "write text test!"; fs.writeFile('writetest.txt', data , function (err) { console.log(err); });
|

|