2016-07-08 10 views
1

その概念を約束javascriptの私が学んでいる単純なケースJavascriptが私の場合

var q = new Promise(function(resolve, reject){ 
     resolve(initRequest('get', 'includes/getRemessaRegistrada.php', null, remessasList)); 
    }).then(function(){ 
     console.log('ok'); 
    }); 

で動作しない約束します。処理を解決する前に、console.log( 'ok')が来るのはなぜですか?

+2

「initRequest」とは何ですか? – robertklep

+0

これをいくつかの非同期関数のようにします。 –

+1

何が返されますか?それが約束を返したら、 'new Promise()'を使ってそれをラップする必要はありません。約束を返さない場合(たとえばコールバックを使用する場合)、コードは期待どおりに機能しません。 – robertklep

答えて

2

コードinitRequest()には何も返されません。コードをそのまま使用するには、initRequest()は基本となる非同期操作に結びついている約束を返さなければなりません。そして、それが約束を返せば、あなたはそれのまわりに別のラッピング約束を必要としません。

基本的な非同期操作が完了したときに何らかの理由でそれを知る魔法の力はありません。彼らはそのような力を持っていません。プロビジョニングは、非同期操作が値またはエラーで完了したときに、プロビジョニングの解決または拒否を適切なタイミングで呼び出す非同期操作がある場合にのみ機能します。この約束は、非同期の結果やエラーを管理し、調整するための使いやすいインターフェイスとして機能します。

initRequest()を実行していて、非同期操作を開始してからすぐに戻り、終了する前に、ラッププロビジョニングのためにresolve(undefined)を呼び出しています。この約束は、initRequest()が実行されるずっと前に解決され、非同期戻り値について何も知らないでしょう。

ここで最善の解決策は、XMLHttpRequestの有名なバージョンを入手したり使用したりすることで、約束を返すだけの関数でajax呼び出しを行うことができます。 jQueryには1つのブラウザが組み込まれています。最新のブラウザでは、Ajaxをお約束し、約束を返してくれる数十の小さなライブラリがあります。あなたがまだこれを組み込んだ(jQueryのような)ライブラリをまだ使用しておらず、これのために特別なものを入手する必要があるならば、おそらくfetch() polyfillを得るでしょう。これは明らかにブラウザの将来の方向性です。

あなただけのシンプルなXHRラッパーや約束のインタフェースを使用してAjaxの呼び出しを行うための方法を望んでいた場合は、ここに行くためにいくつかの方法があります。

How do I promisify native XHR?

XR

Fetch Polyfill


return req.responseTextが含まれているため関数の場合、initRequest()がその値を返していると思うかもしれません。そうではない。 initRequest()は何も返しません。 return req.responseTextがXMLHttpRequest実装の内部に入る非同期コールバックに返されています。 initRequest()関数はすでに返されてから長く、長くてundefinedを返します。このような場合の理由については、How do I return the response from an asynchronous call?を参照してください。

関連する問題