如何停止javascript等待延迟完成?

我有一个函数,它接受一个参数并进行同步加载。

我将其更改为执行异步jQuery.ajax调用以检索数据并调用回调。 旧代码(无法修改)使用相同的function并失败。 我需要能够以两种方式检索数据,以便异步代码可以继续运行,如果异步已经加载了它,旧的同步代码可以检索缓存的数据,同步加载它或等待已经运行的任何异步请求。

var ajaxQueries = {} loadEngineData(fileId, callback) { var sync = callback == undefined; if (ajaxQueries[fileId]) { if (sync) { //Need to stop here and wait for ajaxQueries[fileId] to finish //Execution cannot continue! If we return before defered has ended here 3rd party scripts will fail. return data; } else { ajaxQueries[fileId].done(function(data){callback(data)}); } } else { ajaxQueries[fileId] = $.ajax({ async:!sync, type:'GET', url:fileId2Name(fileId), data:null, dataType:'text', }); if (sync) { var _data = undefined; ajaxQueries[fileId].done(function(data){_data=data}); return _data; } ajaxQueries[fileId].done(function(data){callback(data);}); } } 

如果旧脚本调用该函数,则ajax查询将同步运行,所有后续调用将使用延迟的.done.fail ,一切都会好的。

 var enginePhyData = loadEngineData('physics'); //Do stuff 

如果新脚本首先调用该函数,并且在此加载过程中,旧脚本会尝试从同一文件加载数据,那么最终会出现ajaxQueries[fileId]中的延迟ajax查询异步运行的情况,我必须等待它完成加载数据以避免破坏现有的库。

我简化了loadEngineData以保持焦点问题。 否则它会更复杂一些,并允许调用并行加载的文件列表

 loadEngineData(['geometry', 'scripts'], function() { var phy = loadEngineData('physics'); var geo = loadEngineData('geometry'); var scr = loadEngineData('scripts'); //run the async function; }); loadEngineData('physics', function() { //run the async function; }); //... //in the scripts file var phy = loadEngineData('physics'); //here phy might be undefined if this file went through eval() before `loadEngineData('physics',...)` was called; 

我可以使代码现代化,但问题是某些文件在项目之间共享并在不同的环境中运行。 我目前无法修改旧脚本而不会分离依赖项。

在等待一些异步ajax调用完成时,你无法停止执行javascript。 Javascript根本不起作用。

相反,您必须按照编程方式进行重做,以便希望等待异步ajax调用完成的代码将通过回调函数执行,而不是在执行ajax调用后同步执行。

你很接近,如果是同步请求你只需要返回responseText。

 return data 

 return ajaxQueries[fileId].responseText; 

由于请求是同步的,因此无需等待,浏览器已经等待响应。

 var ajaxQueries = {} loadEngineData(fileId, callback) { var sync = callback == undefined; if (ajaxQueries[fileId]) { if (sync) { return ajaxQueries[fileId].responseText; } else { ...