2016-12-08 12 views
1

JavaScriptの約束で機能を拒否するために行く:呼び出し解決機能は、私は次のコードを持っている

return new Promise (function (resolve,reject) { 
     if (this.ImageData && averageColor) { 
      var xhr = new XMLHttpRequest(); 
      xhr.onreadystatechange = function() { 
       if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) { 
        console.log("Image found"); 
        resolve(xhr.response); 
       }else { 
        console.log("Image not found"); 
        reject(); 
       } 
      } 
      xhr.open('GET', 'http://localhost:8765/color/'+averageColor, true); 
      xhr.send(null); 
     } 
     else { 
      reject(); 
     } 
    }); 

を次のようにこのコードを呼び出す関数は、次のとおりです。

var v = tile.getImage(tile.getColorAverage()); 
     v.then(function (value) { 
      console.log("laughing"); 
     }).catch(function() { 
      console.log("Catch called"); 
     }); 

問題は、私の約束で私です条件が満たされ、サーバーからの応答が正しく得られていることがわかります(console.logのため)。しかし、反対側では、それはまったく「約束」のビットに入ることはありません(一度もありません)。それは何らかの理由で拒絶者に行きます。私はそれを解決するはずのビットを実行するが、私はそれで何も得られないことがわかるように、ナットに行く。どんな助けでも大歓迎です。

編集:

今は一度だけ実行しました。そして、ここに私のconsole.logトレースがあります。今でも多くの混乱した:特に別の値に設定されていない限りPromiseコンストラクタ内

enter image description here

+0

ダウンの問題が発生する前に、そのコードを修正する必要がありますプロミスのリゾルバ機能? – guest271314

+0

あなたは両方の拒否の前にコンソール.logを置くことができます - デバッグするだけです –

答えて

4
xhr.onreadystatechange = function() { 
    if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) { 
     console.log(xhr.response); 
     resolve(xhr.response); 
    }else { 
     reject(); 
    } 
} 

onreadystatechangeにについての事は、それは約束の解像度についての事は一度拒否または解決し、それが再び拒否またはresovledすることができないということです

複数回呼び出され、あります

onreadystatechangeには、呼び出される初めて、ステータスが1になり、4ない...ので、あなたはステータスがある場合にのみ拒否すべき

を拒否4と(完了)ANDステータス!= 200

xhr.onreadystatechange = function() { 
    if (xhr.readyState == XMLHttpRequest.DONE) { 
     if(xhr.status == 200) { 
      console.log(xhr.response); 
      resolve(xhr.response); 
     } else { 
      reject(); 
     } 
    } 
} 

はまた、オンロード使用/ ONERROR - あなたはまだ動作しますが、間違って見える何かについてサイドノートとして

xhr.onload= function() { 
    if(xhr.status == 200) { 
     console.log(xhr.response); 
     resolve(xhr.response); 
    } else { 
     reject(); 
    } 
} 


xhr.onerror= function() { 
    reject(); 
} 

のonload

のステータス== 200をチェックする必要があるものの

return new Promise (function (resolve,reject) { 
    if (this.ImageData && averageColor) { 

約束コンストラクタコールバック内のはwindowことができ、またはそれはさえも、strictモードでundefined可能性 - あなたはthis`は `内にあると`何を期待している、それはトラック

+0

'readystatechange'イベントに' load'イベントを代入すると問題は解決しますか? – guest271314

+0

はい、しかし 'onerror'も扱わなければなりません - そして' onload'はまだ統計を調べる必要があります== 200 –

+0

質問の一部ではない 'Promise'コンストラクタ – guest271314

0

thisは、windowです。 this.ImageDatanew Promise()の呼び出し時に.ImageDataを持つオブジェクトにthisを設定せずにfalseと評価されます。

Promiseコンストラクタリゾルバ関数内this.ImageDataのプロパティImageDataを持つオブジェクトへの置き換えを参照。例えば

function resolver(resolve, reject) { 

} 

new Promise(resolver.bind(/*object that has `.ImageData` as property*/)) 

について

また、readystatechangeイベントをloadイベントを代入し、XMLHttpRequestオブジェクトのerrorイベントハンドラを含みます。

+0

ありがとうございます。それは問題を解決しません。これは、onreadystatechange関数でresolve関数を呼び出すことです(console.logで見ることができます)。しかし、それは今では.thenに現れています – fur866

+0

@ fur866 _ "しかし、今ではそれが現れています。" _あなたはどういう意味ですか? – guest271314

+0

'console.log(xhr.response);'が出力されているという事実は、条件が真であれば(間違っていても)両方を意味します。 - –

1

この問題が発生した理由は、要求が完了する前にonreadystatechangeが複数回呼び出され、完了する前にelseという条件が返され、rejectが呼び出されるためです。 DONExhr.status != 200の場合にのみ拒否してください。次に例を示します。

if (xhr.readyState == XMLHttpRequest.DONE) { 
    if (xhr.status == 200) { 
     resolve(xhr.response); 
    } else { 
     reject(); 
    } 
} 
関連する問題