0

私は Dojo 1.8 のモジュールで遊んでおり、次のように定義されたモジュールがあります。

define(["dojo/request/xhr", "dojo/json"],
  function(xhr, JSON) {

  var url = "server/provider.php";

  return {
    files: {},

    getDirList: function() {
      var self = this;
      xhr(url).then(function(response) {
        response = JSON.parse(response);
        // would love to return the JSON for use here
      }, function(err) {
        console.error(err);
      });
    }
  };

});

そのメソッドを呼び出して使用したい別のモジュールがあります。

define(["dojo/dom",
        "dojo/dom-construct",
        "dojo/_base/array",
        "afm/utils"
        ],
function(dom,domConst,array, utils) {
  return {
    produceHtml: function() {
      var json = utils.getDirList(); //this returns undefined
      var dirLength = json.length;
      console.log(json);
      for (var i = 0; i < json.length; i++) {
        if(i % 2 === 0) {
          domConst.place('<tr class="even"><td>' + json[i].name + '</td></tr>', 'output');
        } else {
          domConst.place('<tr><td>' + json[i].name + '</td></tr>', 'output');
        }
      }

    }
  };
});

当然、DOM 作成コードを util モジュールに入れることもできますが、それは本来あるべきではないビュー ロジックを混在させています。そして、util.getDirList メソッドを再利用したい場合は恐ろしいことです。

そのメソッドによって返される JSON を使用するにはどうすればよいですか? 他の誰かがこれをやっていますか?

4

2 に答える 2

1

dojo/request/xhr 呼び出しの結果は非同期に返されるため、応答パラメータの設定は返された後でのみ行われます。あなたが望むのは Promise を返すことです (ここで読んでください: http://dojotoolkit.org/documentation/tutorials/1.8/promises/ )。

しかし、まず第一に、次のように、dojo/request で json データを解析させることができます。

require(['dojo/request'],function(request) {
    request.get('http://example.com/data.json', {handleAs:'json'}).then(...)
})

こちらをご覧ください: http://dojotoolkit.org/reference-guide/1.8/dojo/request.html#dojo-request

これを組み合わせると、 getDirList 関数は次のようになります。

getDirList: function() {
    return xhr.get(url, {handleAs:'json'});
}

そして、 ProduceHtml で次のようにします。

utils.getDirList.then(function(json) {
    for (var i = 0; i < json.length; i++) {
    if(i % 2 === 0) {
      domConst.place('<tr class="even"><td>' + json[i].name + '</td></tr>', 'output');
    } else {
      domConst.place('<tr><td>' + json[i].name + '</td></tr>', 'output');
    }
});
于 2012-11-05T01:23:12.767 に答える
0

2番目のモジュールでは、すべきではありません

define(["dojo/dom",
        "dojo/dom-construct",
        "dojo/_base/array",
        "afm/utils"
        ],
function(dom,domConst,array) {

なる

define(["dojo/dom",
        "dojo/dom-construct",
        "dojo/_base/array",
        "afm/utils"
        ],
function(dom,domConst,array, utils) {

于 2012-11-04T09:06:39.093 に答える