2016-11-13 4 views
3

私はブラウザで提供されている約束を覚えています。応答の引数が紛失している

validate("http://fhir3.healthintersections.com.au/open", decode(leftFhirView.getValue())) 
 
     .then(function(response) { 
 
      console.log("It worked! '", response, "'"); 
 
     }, function(error) { 
 
      console.error("Failed validation!", error.stack); 
 
     });
ここ

は、私が実行したときに私が取得デバッグ出力です:私はそれを利用する方法

/* uploads a resource to the given server and runs the callback function when done */ 
 
function upload(serverUrl, resource, successfulCallback, failCallback) { 
 
    console.log("upload successfulCallback: ", successfulCallback); 
 
    console.log("upload failCallback: ", failCallback); 
 
\t var jqxhr = $.ajax({ 
 
\t \t url: serverUrl, 
 
\t \t method: "POST", 
 
\t \t type: "POST", 
 
\t \t contentType: "application/json", 
 
\t \t data: encode(resource), 
 
\t \t headers: { 
 
      Accept: "application/json; charset=utf-8", 
 
      Prefer: "return=minimal" 
 
     } 
 
\t }).done(function() { 
 
     console.log("Upload done, jqxhr: ", jqxhr); 
 
\t \t successfulCallback(jqxhr); 
 
\t }).fail(function(err) { 
 
\t \t console.log("upload failed: " + err.responseText); 
 
\t \t failCallback(jqxhr, err); 
 
\t }); 
 
} 
 

 
function validate(endpoint, resource) { 
 
    var parameters = { 
 
     "resourceType": "Parameters", 
 
     "parameter": [{ 
 
      "name": "resource", 
 
      "resource": resource    
 
     }]   
 
    }; 
 
     
 
    return new Promise(function (resolve, reject) { 
 
     console.log("Made new promise, resolve function is: ", resolve); 
 
     console.log("Made new promise, reject function is: ", reject); 
 
     upload(endpoint + '/' + resource.resourceType + "/$validate", parameters, resolve, reject); 
 
    }); 
 
}

そして、これは次のようになります。これは私のコードです

main.js:45 Made new promise, resolve function is: u() { [native code] } 
main.js:46 Made new promise, reject function is: v() { [native code] } 
main.js:14 upload successfulCallback: u() { [native code] } 
main.js:15 upload failCallback: v() { [native code] } 
main.js:27 Upload done, jqxhr: Object {readyState: 4, responseText: "", <snip> 
main.js:196 It worked! ' ' 

あなたが確認できるように、successfulCallback(jqxhr)と応答関数の間のどこかに、my jqxhrは2つのスペースに変わります。何が起こっている?

+1

実際には2つのスペースにはならず、空の文字列になります.2つのスペースはconsole.logによってそこに置かれます。レスポンスのタイプを確認するために 'typeof response'を試してください。' responseText 'は空文字列ですが、コードは引き続き27行目に記録されたjqxhrオブジェクトに解決する必要があります –

+0

' 'Promise'を' upload'の中に作成し、そこから 'return'を作成する必要があります。コールバックパラメータをまったく処理する必要があります。 – Bergi

答えて

0

jQueryの約束をvalidate関数を通して返すように修正しました。

0

@ジャロマンダXがコメントで言ったことを説明する。

Promiseを別のPromiseの内部で解決しようとしています。元のPromiseオブジェクトはthenのコールバックに渡されません。代わりに、元のPromiseオブジェクトの応答テキストになります。この場合

は、jqxhr元のPromise$.ajaxPromiseオブジェクトを返す)であり、その応答テキストが""あります。だからあなたは空の文字列を得るのです。

MDNによって文書によると、あなたのコードが

var original = Promise.resolve(true); 
var cast = Promise.resolve(original); 
cast.then(function(v) { 
    console.log(v); // true 
}); 

以下の例と同じように動作します** @Bergiによって指摘11/14/16

にUpated、jqxhrはインスタンスではありませんPromiseですが、プロパティがthen(約束のようなもの)のJQuery遅延オブジェクトです。ただし、Promise.thenjqxhr.thenを探します。このようなプロパティがあると非同期に約束します。

+0

申し訳ありませんが、まだ混乱しています。アップロードに失敗していないので、なぜ応答テキストが表示されるのですか? また、upload()関数内でjqxhr約束を返すのではなく、コールバックを使用しています(約束があまりにも複雑になることはありません)。 – Vadi

+0

実際には、私はその点を作っていませんでした。なぜ、解決されたオブジェクト 'jqxhr'ではなく、OPが本質的にresponseTextを取得しているのを実際に見ることができません。 –

+0

@Vadiはい、' jqxhr' 'jqxhr.reponseText'は' then'のコールバック関数のパラメータになります。 'successfulCallback(jqxhr)'は、 'jqxhr'が解決された後に呼び出されます。'jqxhr instanceof Promise === true'のため、' .then(function(response){...}) 'の 'response'パラメタの参照は実際に' jqxhr.reponseText'です。これをチェックしてください[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve) –

関連する問題