2013-02-22 71 views
-1

當這個函數被調用時,我想的是,函數等待回調返回對象r返回一旦回調結束對象

function getWmsLayers(oneServerState){ 
      reader = new GeoExt.data.WMSCapabilitiesReader();; 
      var serverLayers = new Array(); 
      var store = new GeoExt.data.WMSCapabilitiesStore({ 
        url: OpenLayers.ProxyHost + oneServerState.serverUrl, 
        reader: reader 
      }); 
      var isCallBackCompleted = false; 
      store.load({ 
        callback: function (r) { 
          return r; 
        } 
      }); 
      //Do something ?? 
      return r; 
    }; 


    layers = getWMSLayers(oneServerState); 
+2

歡迎來到**異步**的美妙世界!你不能那樣做。 – SLaks 2013-02-22 20:11:58

+0

當有回調時,這是有原因的。您不必將響應返回給您的代碼,而需要將您的代碼帶入響應中。 – 2013-02-22 20:13:44

+0

你應該回電,不迴應。類似於「稍後問我」... – 2013-02-22 20:15:05

回答

1

你必須W8的層進行負載。像這樣:

function getWmsLayers(oneServerState, fnCallback){ 
      reader = new GeoExt.data.WMSCapabilitiesReader();; 
      var serverLayers = new Array(); 
      var store = new GeoExt.data.WMSCapabilitiesStore({ 
        url: OpenLayers.ProxyHost + oneServerState.serverUrl, 
        reader: reader 
      }); 
      var isCallBackCompleted = false; 
      store.load({ 
        callback: function (r) { 
         fnCallback(r); 
        } 
      }); 
    }; 

然後調用這個函數與此:

getWmsLayers(serverstate, function (l) { 
     layers = l; 
     nextFunctiontoContinueProgressing(); 
    }); 

這是你如何建立一個回調鏈來完成您的請求。

2

你不能等待一個異步調用之前完成完成。這基本上是一個異步調用的定義!你能做的最好的事情就是把你的調用邏輯分開。因此,而不是這樣的:

stuff(); 
result = doAsyncCall(); // WILL NOT WORK! 
moreStuff(result); 

使用這樣的回調:

stuff(); 
var callback = function (result) { moreStuff(result); }; 
doAsyncCall(callback);