2017-03-12 21 views
0

私は不協和音のJavascriptボットでjQueryを使用しています。ある時点で、取得したデータで構成される文字列を作成するためにWebからデータを取得しています。JSON関数からデータを取得できません

それそれがどのように見えるかをここで:

var jsonFinal = ''; 
var oembed_url = 'http://backend.deviantart.com/oembed?url=http%3A%2F%2Ffav.me%2Fd2enxz7&format=jsonp&callback=?'; 
$.getJSON(oembed_url, function(data) { 
    jsonFinal = "("+data.author_name+")\n"+data.url; 
     console.log(jsonFinal); 
    }); 

console.log(jsonFinal): 

あなたが見ることができるように、最後にすべてのデータが含まれていることになっているVAR「jsonFinalは」、空白の初期化されます。 しかし、実際には、jsonFinalには最初のconsole.log(関数内)に目的の情報が含まれていますが、2番目のconsole.logではnullになります[何も表示されません]。

これは、変数jsonFinalが2つのconsole.logの間で消去されるか、またはこれらが同じ名前の2つの別個の変数であることを意味しますが、関数 "jsonFinal"から情報を取得できません。

どうすればいいですか?

+1

可能な重複http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchronous-call) –

+0

http://stackoverflow.com/questions/10456410/global-variable-in-javascript-not-set-when-using-getjson –

+0

http://stackoverflow.com/questions/3537434/cant- get-correct-return-value-from-jquery-ajax-call –

答えて

2

$.getJSONが非同期であるためです。

console.log(jsonFinal):の2番目のインスタンスは、最初のインスタンスの前に実行されます。

「機能外」の情報を取得するには、$.getJSONの中から機能を呼び出すか、内部で作業する必要があります。

$.getJSON(oembed_url, function(data) { 
    jsonFinal = "("+data.author_name+")\n"+data.url; 
    fromInside(jsonFinal); 
    }); 

function fromInside(data) {...} 

それとも、あなたが使用しているのNode.jsのバージョンに応じて、その他の約束、発電機、非同期/待つを、使用することができ、あなたは/ babelを使用していないしている場合。

node-fetch(約束ベースのスタイルの場合)を使用できます。

fetch(oembed_url) 
.then(res => res.json()) 
.then(jsonFinal => { 
    console.log(jsonFinal) 
}) 

あなたはNode.jsのv7を使用している場合は、調和フラグの後ろasync/awaitのロックを解除します。しかし、唯一の機能の内部 -

node --harmony-async-await app.js

は、その後、あなたは、実際にプログラムが「jsonFinalが値を持っているのを待つ」ことができます。

async function getJSON(oembed_url) { 
    let response = await fetch(oembed_url) 
    let jsonFinal = await response.json() 
} 
+0

これは有望で、私は試してみるつもりです。しかし、これは、ブラウザではなくNodeJSを使用する不協和音ボットであるため、処理に時間がかかる同期メソッドはまったく問題にはなりません。プログラムを「jsonFinalが価値を持つのを待つ」ようにする方法はありますか? – Rackover

+0

「jQuery 1.5以降、 '$ .getJSON()によって返されたjQuery XHRオブジェクトは' Promise'インタフェースを実装し、 'Promise'のすべてのプロパティ、メソッド、および動作を与えます。 – Whymarrh

+0

@Rackover、Updated。 @Whymarrh、確かに。しかし、彼が '$ .getJSON()'メソッド(おそらく)のためだけに 'jQuery'を使っていた場合、彼は' node-fetch'のようなものに対してjQueryの依存関係を落とすかもしれません。 –

1

@Raphaelと同様に、あなたはこれを使って、それを達成することができます

$.ajax({ 
    url: url, 
    dataType: 'json', 
    async: false, 
    data: mydata, 
    success: function(data) { 
    //stuff 
    //... 
    } 
    }); 
+0

同期XHRを使用するには、[**非常に悪い**アイデア](http://stackoverflow.com/questions/8026191/can-i-use-jquery-getscript-without-a-callback/8026693#8026693)ですコール。 *ある時点でブラウザ*がロックされ、エンドユーザーに不満を募らせます。 –

1

$ .getJSONは非同期メソッドです...だから、外にconsole.logは、サービスが返すデータの前に実行してきています。

$ .getJSON返品約束オブジェクト。あなたは、サービスコールの後にいくつかのアクションを行う約束の方法を使用することができます。

$.getJSON(oembed_url, function(data) { 
    jsonFinal = "("+data.author_name+")\n"+data.url; 
     console.log(); 
    }).done(function() { 
    console.log(jsonFinal); 
    }); 
[私は非同期呼び出しからの応答を返すにはどうしますか?](の
関連する問題