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方法。它实际上非常优雅(一旦你习惯了)。就像鱼子酱一样。)