2017-09-14 7 views
0

응용 프로그램을 프로토 타이핑하는 동안 RequireJS를 사용하고 있습니다. 나는 ajax를 통해 json 파일을로드하여 실제 데이터베이스를 "위장"하고있다.AJAX 호출 결과를 AMD 모듈로 사용

이 json 파일을 필요로하는 모듈이 여러 개 있는데, 여러 개의 HTTP 요청이있는 것으로 나타났습니다. 이미 RequireJS를 사용하고 있기 때문에 "이 json 파일을 다른 모듈로로드하지 않을까요?"라고 생각했습니다. 모듈은 객체를 반환 할 수 있으므로 합리적으로 보입니다. 작동하지 않는 내가 무엇을하고있어 왜

// data.js 
define(function(require){ 
    const $ = require('jquery') 
    var data = {} 
    $.getJSON('/path/to/data.json', function(json_data){ 
    data = json_data 
    }) 
    // this does not work because getJSON is async 
    return data 
}) 

// some_module.js 
define(function(require){ 
    const my_data = require('data') 

    console.log(data) // undefined, but want it to be an object 
}) 

내가 이해 :

그래서 나는이 시도했다. 나는 이것을 실제로하는 가장 좋은 방법이 무엇인지는 모르겠다. AMD의-Y가 무엇을 달성하고 싶다 데이터

을 반환하려고하기 전에 while (data == null) {}를 추가

  • 변경해서 getJSON을 async: false
  • 에 :

    것들 내가하고 싶지 않아 내가하려고하는거야? 여기에 더 좋은 접근법이있을 것입니다.

    편집

    난 그냥이 시도. 그것은 작동하지만, 나는 이것이 좋은 또는 끔찍한 생각이 있는지 확실하지 않습니다 :

    // in data.js 
    return $.getJSON('/path/to/data.json') 
    
    // in some_module.js 
    const my_data = require('data') 
    my_data.then(function(){ 
        console.log(my_data.responseText) 
        // do stuff with my_data.responseText 
    }) 
    

    내 관심사입니다 (1) 브라우저 지원 (이, 오른쪽 "약속"입니다?)과 (2)의 경우 여러 모듈이 동시에 이것을 수행하면 폭발 할 것입니다.

+0

약속을 사용하는 것이 좋습니다. – SLaks

+0

IE가 약속을 지원하지 않지만 내 편집이 이상하게 IE에서 작동했습니다. 실제로 JQuery의 ['deferred.then()'] (https : // api.)를 호출 한'.then() '을 사용하여 약속을 사용하려는 것 같지만 (데이터가 JQuery 객체로 들어가기 때문에) jquery.com/deferred.then/) 메소드를 사용하여 IE에서 작동하는 이유는 무엇입니까? – Scribblemacher

+0

예; jQuery는 자체 약속 구현 ('지연')을 포함하며 기본 약속을 사용하지 않습니다. – SLaks

답변

0

이 질문은 JQuery를 사용하는 것을 특별히 언급하기 때문에 실제로 JQuery의 deferred.then()을 사용하여 기본 약속없이이 작업을 수행 할 수 있습니다. 이 장면 뒤에 약속을 사용하고 같은 jQuery의 문서에서 then()의 설명을 바탕으로

// in data.js 
return $.getJSON('/path/to/data.json') 

// in some_module.js 
const my_data = require('data') // this is a JQuery object 
// using JQuery's .then(), not a promise 
my_data.then(function(){ 
    console.log(my_data.responseText) 
    // do stuff with my_data.responseText 
}) 

이 보이는 : jQuery를 1.8로

을의 deferred.then() 메소드는 새를 반환 이제는 deprecated deferred.pipe() 메소드를 대체하여 함수를 통해 지연된 상태와 값을 필터링 할 수 있습니다. [...]

콜백은 추가 된 순서대로 실행됩니다. deferred.then가 Promise를 반환하기 때문에, Promise 객체의 다른 메소드는 추가 .then() 메소드를 포함하여이 객체에 연결될 수 있습니다.

JQuery의 .then()은 IE에서 작동하기 때문에 IE 내부에서 IE에 대한 약속이다고 생각합니다.