2012-11-04 67 views
0

我玩模块道场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?还有其他人在做这个吗?

回答

1

道场/请求/ XHR调用的结果进来异步,因此设置的响应参数是做仅返回后。 你想要的是返回一个承诺(在这里阅读:http://dojotoolkit.org/documentation/tutorials/1.8/promises/)。

但首先:你可以做道场/请求解析为您的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'); 
    } 
}); 
+0

谢谢。这总是让我感到异步的东西。我可能不应该触碰Node.js,直到我得到一个体面的处理! –

+0

我只会添加一个方法调用需要括号。 utils.getDirList(),然后(函数(JSON)......等 –

+0

感谢指出了这一点吉姆但我们不只是从SO复制粘贴还是我们;)。 –

0

在你的第二个模块,不应

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) { 

+0

是的,我应该修改我的例子。这只是我从现在工作中恢复过来的一个简单例子。 (我在回调中加入了HTML生成代码 - 所以你会看到其中的残余)。做你所建议的不允许我看到utils.getDirList方法的返回。 –

+0

好的我认为我更好地理解你的问题。你可以做这样的: 'VAR MYDATA的= ''; XHR(URL,{ \t handleAs: “JSON” \t})然后(函数(数据){ \t myData的数据=; });。 返回myData的;' –

+0

我试图让该模块仅仅是一类用于查询和给人一种原始结果。我还没有玩过Dojo,通常在jQuery中,我的回调直接处理结果(解析JSON并填充一些HTML),我想解耦它。虽然JS的异步特性需要更多思考。 –