2017-09-14 13 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は独自の約束の実装( 'Deferred')を含み、ネイティブの約束を使用しません。 – SLaks

答えて

0

この質問は、特にJQueryを使用することを指しているので、実際にはJQueryのdeferred.then()を使用してネイティブの約束なしにこれを行うことができます。 deferred.then()メソッドは、新しいを返し、jQueryの1.8のよう

:これは舞台裏での約束を使用しているように見える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 
}) 

、関数によって遅延された状態と値をフィルタリングし、now-deprecated deferred.pipe()メソッドを置き換えることができます。 [...]

コールバックは追加された順に実行されます。 deferred.thenはPromiseを返すので、Promiseオブジェクトの他のメソッドは、追加の.then()メソッドを含むこれに連鎖できます。

JQueryの.then()はIEで動作するので、私は彼らの裏でIEの約束事を果たしていると思います。

関連する問題