アプリケーションのプロトタイプ作成中に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)の場合、複数のモジュールが同時にこれを行うと、それが爆発するでしょう。
約束を使用することをお勧めします。 – SLaks
IEが約束をサポートしていないにもかかわらず、私の編集がIEで奇妙に働いていました。実際にJQueryの['deferred.then()'](https:// api)を呼び出した '.then() 'を使って、私は約束を使用しようとしていましたが、データがJQueryオブジェクトに入っているようです。 jquery.com/deferred.then/)メソッド、なぜそれがIEで動作した。 – Scribblemacher
はい。 jQueryは独自の約束の実装( 'Deferred')を含み、ネイティブの約束を使用しません。 – SLaks