2013-02-22 62 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);