2014-08-27 4 views
1

지연 함수를 처음 시도한 것이므로 분명히 잘못되었습니다. 나는 조금이 일을 분명히 몇 가지 방법을 거기로 혼동있어하지만 난 찾을 수있는 간단한에서 작업을 시도Deferred getJSON의 반환 값이 정의되지 않았습니다.

Get_JSON(my_url).done(function(data) { 
    console.log(data['name']); 
}); 

function Get_JSON(url) { 
    var def = $.Deferred(); 
    $.getJSON(url).done(function(data){ 
     console.log(data['name']); 
     def.resolve({ 
      data:data 
     }); 
    }); 
    return def; 
} 

내 콘솔 출력은 다음과 같습니다

John 
undefined 

(요한이 예상 이름 인)

나는 그것이 잘못되고있는 부분이 def.resolve이라고 생각합니다. 당신이 당신의 코드를 단순화 할 수 있습니다, 그러나

Get_JSON(my_url).done(function(data) { 
    console.log(data.data['name']); 
}); 

:

Get_JSON(my_url).done(function(data) { 
    console.log(data['name']); 
}); 

function Get_JSON(url) { 
    return $.getJSON(url); 
} 

해야 할 것 :

답변

3

귀하의 주요 문제는 잘못된 키를 사용하고 있다는 것입니다 또는 이것에조차 :

$.getJSON(my_url).done(function(data) { 
    console.log(data['name']); 
}); 

기본적으로 $.getJSON은 이미 Deferred 개체를 반환하며 코드는이를 프록시하여 중복을 추가합니다.

+0

불필요한 기능 프록시를 피하기 위해 +1 – pomeh

+0

'.name'뿐만 아니라'data'의 모든 속성을 검사 할 수있는'console.dir (data)'를 고려하십시오. –

1

올바른 동작입니다. resolve 호출에서 객체 {data: data} (객체 A라고 부름)을 전달하므로 data 키를 가진 객체이고 $.getJSON(url).done 콜백 (객체 B라고 부름)의 data 객체 인 객체입니다. 이 마지막 객체는 name 키를 가지고 있지만, 당신은 당신의 Get_JSON(my_url).done 콜백에서 검색 할 객체 (만 data 키가) 객체 A와하지 객체 B.이다

이 같은 코드를 작성해야한다 :

Get_JSON(my_url).done(function(data) { 
    console.log(data['name']); 
}); 

function Get_JSON(url) { 
    var def = $.Deferred(); 
    $.getJSON(url).done(function(data){ 
     console.log(data['name']); 
     def.resolve(data); // here is the only difference 
    }); 
    return def; 
} 
+0

'$ .getJSON()'이 이미 약속을 반환하기 때문에 지연을 생성 할 필요가 없습니다. 단지 약속을 사용하는 것뿐입니다. – jfriend00

+0

@ jfriend00 당신은 절대적으로 옳습니다. 그래서 나는 왜 tcooc의 대답을 upvote했습니다. 그러나 이것이 내 대답의 요점이 아니 었습니다. – pomeh

관련 문제