Javascript 回调完成后返回一个对象
调用此函数时,我希望该函数在返回对象Javascript 回调完成后返回一个对象,javascript,extjs,Javascript,Extjs,调用此函数时,我希望该函数在返回对象r function getWmsLayers(oneServerState){ reader = new GeoExt.data.WMSCapabilitiesReader();; var serverLayers = new Array(); var store = new GeoExt.data.WMSCapabilitiesStore({
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);
您不能等待异步调用完成。这本质上就是异步调用的定义!。你所能做的最好的事情就是分开你的呼叫逻辑。因此,与此相反:
stuff();
result = doAsyncCall(); // WILL NOT WORK!
moreStuff(result);
使用如下回调:
stuff();
var callback = function (result) { moreStuff(result); };
doAsyncCall(callback);
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);
}
});
};
要加载层,必须使用w8。像这样:
stuff();
var callback = function (result) { moreStuff(result); };
doAsyncCall(callback);
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();
});
这就是如何建立回调链以完成请求。欢迎来到奇妙的异步世界!你不能那样做。当有回调时,它是有原因的。您需要将代码带到响应中,而不是将响应返回到代码中。您应该回电话,而不是响应。类似于“稍后再问我”…@SLaks:所以我必须将剩余代码放在
回调
参数中?这真是一个丑陋的恶作剧…:(这不是一个丑陋的OO方法。它实际上非常优雅(一旦你习惯了)。就像鱼子酱一样。)