[過去ログ] + JavaScript の質問用スレッド vol.121 + [無断転載禁止]©2ch.net (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
299: 2016/07/29(金)00:07 ID:Yq4kvMV2(1/16) AAS
>>297
> 「非同期処理と例外」の話の流れの上でそういう”一度きり”の例外処理を実現するためにプロミスを使ってるんでしょ?

Promiseとは処理が終わった後でthenに書いたコードが実行されることで
非同期処理を同期的のように書きたいときに使うもの。

エラーを1回だけ表示したいためにPromiseのrejectの
挙動(機能ではなくて挙動)を利用するっていうのは、

例えば関数の中で処理を中断してそこまでの計算結果(エラーコードではなく)を
返すときに例外を使えますって言ってるようなもんなんだよ。
それは正しい使い方じゃない。

非同期のために使う機能を非同期とは関係なく、
省1
301: 2016/07/29(金)01:53 ID:Yq4kvMV2(2/16) AAS
>>300
話は単純だよ。

Promise(約束)っていうのは何を約束するかというと
処理が正常に終わったらthenで書いた処理を将来実行しますっていう約束
それを満たしていないのだから、Promiseの間違った使い方だって話。

動けば何でも良いでしょ?じゃないんだよ(笑)
302
(1): 2016/07/29(金)01:56 ID:Yq4kvMV2(3/16) AAS
あのコードでは、一定時間後に解決する処理は何も書いてない。
一度きりの処理も何も書いていない。

果たされるPromise(約束)はなにもありません。
約束することはないけど約束しましょうというふざけたコード
305: 2016/07/29(金)02:57 ID:Yq4kvMV2(4/16) AAS
>>304
値のプレースホルダーになってないって話。
値のプレースホルダーっていうのは、
値を返すってことだろ?

resolve(値)をやって、値を返していないのだから、
これは間違った使い方。
306: 2016/07/29(金)03:00 ID:Yq4kvMV2(5/16) AAS
>>303
> 条件が満ちることを利用するのは良いのに条件が満ちないことを利用するのはダメなの?
条件が満ちないことを利用するのがだめなんじゃない。
条件が満ちないことは、利用しても利用しなくてもどっちでも良い。
これは関係ない部分。

条件が満ちることを利用しなければだめだって言ってるんだよ。
条件が満ちること=値を返すこと。
resolve(値) がないPromiseはPromiseの処理が永久に終わらない。
非同期だから進むってだけでそのPromiseの処理は無限ループと一緒。
307: 2016/07/29(金)03:07 ID:Yq4kvMV2(6/16) AAS
>>281がPromiseだというのなら、

var p1 = new Promise(function(res,rej){
 for (52枚分) {
  var img = new Image()
  img.onload = function () { 処理 }

  img.onerror = rej
  img.src = どこか
 }
}).catch(function() {
 alert("読み込みエラー")
省6
311: 2016/07/29(金)09:19 ID:Yq4kvMV2(7/16) AAS
だからそれが、例外使って正常系の戻り値を返しました。どやぁw
みたいだって話だってこと。
例外を使って正常系の戻り値を返すのは例外の正しい使い方じゃない。
そんなの自信満々に提示されてもねぇ

そしてPromiseの場合は、Promiseでやらなければならない
戻り値を返す(resolve)ということを書いていない。
これは間違った使い方なんだよ。
313: 2016/07/29(金)09:36 ID:Yq4kvMV2(8/16) AAS
不正なPromiseオブジェクトを生成しているって
自覚がないのかね?w

もしこれを書くとしたら、しっかりコメント残さないといけないね。

// このコードはPromiseを使っているが、Promiseがresolve状態になることはない
// rejectを使って、エラーメッセージを1回しか出さないために使っているだけである。
// 本来は1回しか呼び出すものではないrejectを複数回呼び出すことがあるが、
// これは意図的にやっておりバグではない。
// 仕様上許させた操作であるかわからないが、動いているようである。
314: 2016/07/29(金)09:38 ID:Yq4kvMV2(9/16) AAS
補足w

// このコードはPromiseを使っているが、Promiseがresolve状態になることはないので
// 通常のPromiseオブジェクトと同じように使うことは出来ない。
330
(1): 2016/07/29(金)20:59 ID:Yq4kvMV2(10/16) AAS
>>322
> もちろんonloadとやらの中でresolveするだろ。
それだとじゃあこのコードはなんのために書いたの?って話になるw

onloadの中でresolveを何回も呼び出してはいけない。
理由はわかるだろうけど、resolveした後にrejectする必要があるかもしれないからね。

だからすべての処理が終わった一番最後にresolveしないといけない。
つまりonloadで変数を52からカウントダウンしていって0になったときにresolveを
する必要がある。

だから、
1. Promiseのcacheを変則的なやり方で利用し、かつ変数をカウントダウンするしなければいけない面倒な方法と
省4
331: 2016/07/29(金)21:02 ID:Yq4kvMV2(11/16) AAS
>>325
> 静的メソッドPromise.reject(reason)の戻り値は常にrejectされていてresolveは絶対に発生しない
> Promiseオブジェクトは必ずしもresolveになり得なくとも良いとPromise自身の実装が証明している

大きな勘違いしてるぞw
Promiseはrejectもしくはresolve状態のどちらかになる(約束されている)

>>281はどちらにもならならず(エラーが発生しなければ)終わらない
Promiseになっているから間違った使い方だって話。
332
(1): 2016/07/29(金)21:08 ID:Yq4kvMV2(12/16) AAS
>>315
> Promiseについてだけど
> 主処理内で手間のかかる処理を行う為の手段として認識して良いのかな?

時間がかかる処理を実行するときに、操作不能になってはいけない。
それを解決する手段として従来はコールバックが利用されていた。

だけどコールバックを使うと、処理が終わったあとに次の処理を行って
その処理が終わった後に次の処理を行う、というのが連続したとき
何重ものネストするコードを書かなくてはいけなかった。

それを解決したのがPromise。
この「処理が終わって」というのをthenメソッドを使って
省3
333
(1): 2016/07/29(金)21:14 ID:Yq4kvMV2(13/16) AAS
>>281をシンプルな方法で書き換えたらこうなる。
(元レス>>251を修正したほうが楽だけどw)

var suppress = false;
for (52枚分) {
 var img = new Image()
 img.onload = function () { 処理 }

 img.onerror = function() {
  if (suppress) return;
  alert(
334
(8): 2016/07/29(金)21:15 ID:Yq4kvMV2(14/16) AAS
なんか2ちゃんバグってるな。ブラウザからダブルクォート入りの文章入れると壊れる。

>>281をシンプルな方法で書き換えたらこうなる。
(元レス>>251を修正したほうが楽だけどw)

var suppress = false;
for (52枚分) {
 var img = new Image()
 img.onload = function () { 処理 }

 img.onerror = function() {
  if (suppress) return;
  alert('読み込みエラー')
省4
336: 2016/07/29(金)21:46 ID:Yq4kvMV2(15/16) AAS
>>335
> 考え方は解ったけれど、記述がゴチャゴチャしそうだな。

1. thenで呼び出す関数の中ではごちゃごちゃした処理をしない。
2. ごちゃごちゃした処理を行いたい場合は関数として切り出して戻り値としてPromiseオブジェクトを返す。
3. アロー関数を使う。

この3つを守れば(もちろん厳密に守る必要はないけど)
単純な逐次処理であれば

func1()
 .then(ret1 => func2(ret1))
 .then(ret2 => func3(ret2))
省5
337: 2016/07/29(金)21:49 ID:Yq4kvMV2(16/16) AAS
>>335
そうそう。もう一つ、コールバックでは例外発生時の扱いが
大変だったと言うのがある。
コールバックの場合、例外が発生してもコード上の
外のスコープのtry-catchでキャッチするのは単純には実現できない。

Promiseを使えば、途中で例外が起きたときに
チェーンで繋いだ次のcatchにジャンプしてくれる。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.036s