JavaScript
たとえば、次の JavaScript コードがあります (Dojo 1.6 は既にロードされています)。
dojo.require("dojo.io.script")
// PART I
var jsonpArgs = {
url: "http://myapp.appspot.com/query",
content: {
id: "1234",
name: "Juan",
start_date: "2000-01-01",
callback: "recover"
}
};
// PART II
dojo.io.script.get(jsonpArgs).then(function(data) {
console.log(data);
});
// PART III
function recover(data) {
console.log(data);
}
ブラウザからの直接クエリ
アドレス バーに次のように入力したかのように、サーバーがクエリを受信することを理解しています。
http://myapp.appspot.com/query?id=1234&name=Juan&start_date=2000-01-01&callback=recover
期待される反応
ブラウザーのアドレス バーを使用してサーバーに直接クエリを実行すると、application/json
ブラウザーでレンダリングされた MIME タイプとプレーンテキストで、次のようなメッセージが表示されます。
recover(
{
id: 1234,
name: Juan,
data: [
["2000-01-01", 1234],
["2000-01-02", 5678]
]
}
);
問題
さて、JavaScript のパート II を振り返ると、JSONP リクエストをdojo.io.script.get(jsonpArgs)
. これはオブジェクトを返します。このオブジェクトは、その後にDeferred
チェーンすることで利用できます.then
。イベントのハンドラーを定義して.then
、キャプチャーdata
したものをコンソールに出力することに注意してください。
ただし、コンソールに表示されるのはEvent
. そのデータ ツリーを検索しようとしましたが、期待したデータが見つかりませんでした。
質問
- JSONP リクエストのレスポンスはどこに保存されますか? どうすれば見つけられますか?
- 私のサーバー (私が管理) は、要求されたデータのプレーンテキスト レンダリングのみを出力し、
callback
関数 (ここでは として指定) でラップし、 MIME タイプrecover
を指定します。application/json
応答データがオブジェクトによってキャプチャされるように、サーバーに設定する必要があるものは他にありDeferred
ますか?
試みられた解決策
コールバック関数を定義することで、実際に応答を回復できます (この場合recover
は、JavaScript のパート III にあります)。ただし、Dojo チュートリアルでは、Deferred
(および.then
) フレームワークを使用してデータを復元しただけです。Dojo を使用してどのように行うDeferred
のですか?
更新 (Dojo チュートリアルの Twitter の例を使用)
たとえば、Dojo チュートリアルGetting Jiggy With JSONPのこのスクリプトを取り上げます。データをコンソールに記録するように編集しました。
dojo.require("dojo.io.script");
dojo.io.script.get({
url: "http://search.twitter.com/search.json",
callbackParamName: "callback",
content: {q: "#dojo"}
}).then(function(data){
//we're only interested in data.results, so strip it off and return it
console.log(data); // I get an Object, not an Event, but no Twitter data when browsing the results property
console.log(data.results) // I get an array of Objects
return data.results;
});
の場合、私のケースで示されているように ではなく、console.log(data)
が得られます。この例は、データが にあることを暗示しているため、このツリーもブラウズしようとしましたが、Twitter から期待したデータが表示されません。私は途方に暮れています。Object
Event
data.results
の場合、s のconsole.log(data.results)
配列を取得しObject
ます。Twitter に直接クエリを実行すると、これがプレーンテキストで取得されます。それぞれObject
には、ユーザー名、時間、ユーザーのポートレート、ツイート自体など、通常のツイート メタデータが含まれています。簡単です。
これは私の頭を直撃します。.then
匿名関数であるチェーンのハンドラーは、引数を 1 つだけ受け取りますdata
。しかし、results
プロパティconsole.log(data)
と返されたオブジェクトconsole.log(data.results)
が異なるのはなぜですか?