2014-06-23 51 views
1

我希望得到調用我的道場模塊的值(對象存儲),但我不斷收到未定義:致電道場模塊返回的對象存儲價值

模塊:

define(['dojo/store/Memory', 'dojo/_base/xhr', "dojo/data/ObjectStore"], 
     function (Memory, xhr, ObjectStore) { 
    var oReachStore; 
    return { 
     Reaches: function (url) { 
      xhr.get({//get data from database 
       url: url, 
       //url: url, 
       handleAs: "json", 
       load: function (result) { 
        var ReachData = result.GetReachesResult; 
        var ReachStore = new Memory({ data: ReachData, idProperty: "label" }); 
        oReachStore = new ObjectStore({ objectStore: ReachStore }); 
       }, 
       error: function (err) { } 

      }); 
     }, 
     GetReaches: function() { 
      return oReachStore; 
     } 
    } 

}); 

電話到模塊:

Data.Reaches(dataServiceUrl);//set the reach object store 
ReachData = Data.GetReaches();//get the reach object store, but is always undefined 

回答

1

就像你可能已經注意到了(通過讀取你的答案),是您使用的是異步查找(XMLHttpRequest在這種情況下是異步的),但是在可能設置之前,您依賴於該存儲。

一個可能的解決方案是使用promises/deferreds。我不知道您使用的是哪種Dojo版本,但在Dojo < 1.8中,您可以使用dojo/_base/Deferred模塊,自1.8版以來,您可以使用dojo/Deferred模塊。語法略有不同,但概念是相同的。

首先你改變oReachStore到:

var oReachStore = new Deferred(); 

然後,你Reaches功能裏面,你不更換oReachStore,但您使用Deferred::resolve()功能,例如:

return { 
    Reaches: function (url) { 
     xhr.get({//get data from database 
      url: url, 
      //url: url, 
      handleAs: "json", 
      load: function (result) { 
       var ReachData = result.GetReachesResult; 
       var ReachStore = new Memory({ data: ReachData, idProperty: "label" }); 
       oReachStore.resolve(ew ObjectStore({ objectStore: ReachStore })); // Notice the difference 
      }, 
      error: function (err) { } 
     }); 
    }, 
    GetReaches: function() { 
     return oReachStore; 
    } 
} 

然後在你的代碼中你可以使用:

Data.Reaches(dataServiceUrl);//set the reach object store 
Data.GetReaches().then(function(ReachData) { 
    console.log(ReachData); // No longer undefined 
}); 

因此,現在ReachData不會返回undefined,因爲您正在等待解決問題。

延遲實際上是JavaScript世界中的一種常見模式,實際上與定義自己的回調相比,它更加穩定。例如,如果你會得到你的XHR請求中有錯誤,你可以使用:

error: function(err) { 
    oReachStore.reject(err); 
} 

一個簡單的例子(我嘲笑通過setTimeout()異步請求)可以的jsfiddle發現:http://jsfiddle.net/86x9n/

1

我需要使用函數GetReach的回調函數。以下修改後的代碼工作: 模塊:從主頁

define(['dojo/store/Memory', 'dojo/_base/xhr', "dojo/data/ObjectStore"], 
function (Memory, xhr, ObjectStore) { 
    return { 
     GetReach: function (url, callback) { 
      xhr.get({//get data from database 
       url: url, 
       //url: url, 
       handleAs: "json", 
       load: function (result) { 
        var ReachData = result.GetReachesResult; 
        var ReachStore = new Memory({ data: ReachData, idProperty: "label" }); 
        var oReachStore = new ObjectStore({ objectStore: ReachStore }); 
        callback(oReachStore); 
       }, 
       error: function (err) { } 

      }); 
     } 
    } 
}); 

電話:

// .... 
Data.GetReach(dataServiceUrl, SetReach); 
function SetReach(data) { 
    //set data for the dropdown 
    ddReach.setStore(data); 
} 
+0

感謝我將使用此方法 – pvitt