2017-03-12 4 views
0

불협화음 Javascript 봇에서 jQuery를 사용하고 있으며 웹에서 데이터를 가져 와서 검색된 데이터로 구성된 문자열을 작성하고 있습니다. 당신이 볼 수 있듯이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 (함수 내부)에 원하는 정보를 포함하지만 두 번째 console.log에서는 다시 null이됩니다. 아무 것도 표시하지 않습니다.

변수 jsonFinal이 두 console.log 사이에서 지워지거나 동일한 이름을 가진 두 개의 별개의 변수 인 것을 의미합니다. 그러나 "jsonFinal"함수에서 .getJson 정보를 가져 오는 데 실패합니다.

어떻게하면됩니까?

+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):의 두 번째 인스턴스는 첫 번째 인스턴스보다 먼저 실행됩니다.

"out of the function"정보를 얻으려면 $.getJSON에서 함수를 호출하거나 내부에서 작업해야합니다.

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

function fromInside(data) {...} 

또는 당신은 당신이 사용하고있는 Node.js를 어떤 버전에 따라 등을 약속, 발전기, 비동기/기다리고 있습니다를 사용할 수 있습니다, 당신은/babel를 사용하지 않는 경우.

node-fetch (약속 기반 스타일 용)을 사용할 수 있습니다. 당신은 Node.js를 v7를 사용하는 경우

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

, 조화 플래그 뒤에 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, 업데이트. @Whymarhh, 물론. 그러나 그가'$ .getJSON()'메소드 ('jQuery' 만 사용하고있을 가능성이 높다면)에서'node-fetch'와 같은 것으로 jQuery 의존성을 떨어 뜨릴 수 있습니다. –

1

as @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 return promise object. 서비스 콜 후에 어떤 조치를 취할 수있는 약속 된 방법을 사용할 수 있습니다.

$.getJSON(oembed_url, function(data) { 
    jsonFinal = "("+data.author_name+")\n"+data.url; 
     console.log(); 
    }).done(function() { 
    console.log(jsonFinal); 
    }); 
[I 비동기 호출의 응답을 반환합니까?] (의
관련 문제