在响应完成之前阻止javascript执行
我有js代码,它为我的表返回数据行。单击这些行中的每一行,它们展开并计划通过调用另一个ajax请求来显示该行的子数据 我的子数据代码如下所示:在响应完成之前阻止javascript执行,javascript,asynchronous,callback,synchronous,Javascript,Asynchronous,Callback,Synchronous,我有js代码,它为我的表返回数据行。单击这些行中的每一行,它们展开并计划通过调用另一个ajax请求来显示该行的子数据 我的子数据代码如下所示: function format ( d ) { var results; $.ajax({ url: 'http://127.0.0.1:7101/MUDRESTService/rest/v1/feedbacks/' + d.FeedbackId + '/child/MudFeedbackDetailsVO?onlyData=t
function format ( d ) {
var results;
$.ajax({ url: 'http://127.0.0.1:7101/MUDRESTService/rest/v1/feedbacks/' +
d.FeedbackId + '/child/MudFeedbackDetailsVO?onlyData=true',
type: 'get',
dataType: 'json',
success: function(output) {
console.log(output.items[0].CriticalPath) ;
results = output.items[0];
}
});
return results.CriticalPath;
}
问题可能是方法没有在results.CriticalPath的时间值之前完成。我可以在ChromeJS控制台中看到值,所以数据部分没有问题
那么,我应该如何让它在响应就绪后返回值呢?在编写异步代码时,您需要开始使用回调而不是返回值 您的函数,如此处的
格式
,只会启动一个操作。对UI的更新由回调启动
而不是这种逻辑:
function doSomething() {
var result = format(d);
doSomethingWithResult(result);
}
您需要适应以下情况:
function doSomething() {
var result = format(d, doSomethingWithResult);
}
function format( d, callback ) {
$.ajax(..., {
success : function(output) {
var results = output.items[0];
callback(results); // this is where we call doSomethingWithResult
}
});
}
现在我不想在这方面下功夫,但希望您能从代码示例中找到一些可以使用的东西 我将绑定.done()-函数上的每一行,该函数调用另一个api。我希望这有帮助
(函数(){
//getJSON示例
var jqxhr=$.getJSON(“https://api.myjson.com/bins/2emll“,函数(数据){
用于(输入数据){
$(“#list”).append(““+data[key]+” ”);
}
}).完成(功能(数据){
$(“#列表li”)。在(“单击”上,函数(e){
var target=e.target.className;
//ajax示例
$.ajax({
网址:'https://api.myjson.com/bins/309x5',
键入:“get”,
数据:目标,
数据类型:“json”,
成功:功能(数据){
var title=$(“+target).text();
$(“+target).html(title+”
);
}
}).完成(功能(数据){
用于(输入数据){
$(“#ul-”+target).append(“”+data[key]+” ”);
}
});
});
});
})();
您可以尝试将async
选项设置为false
像这样
function format ( d )
{
var results;
$.ajax({
url: 'http://127.0.0.1:7101/MUDRESTService/rest/v1/feedbacks/' + d.FeedbackId + '/child/MudFeedbackDetailsVO?onlyData=true',
type: 'get',
dataType: 'json',
async:false,
success: function(output)
{
console.log(output.items[0].CriticalPath) ;
results = output.items[0];
}
});
return results.CriticalPath;
}
注:
但是它会使您的ajax同步,并且您的浏览器可能对请求没有响应,因此在使用它之前需要注意一些要点
默认情况下,所有请求都是异步发送的(即,默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和数据类型:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从jQuery1.8开始,不推荐在jqXHR($.Deferred)中使用async:false;您必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()
Ajax中的第一个字母代表“异步”,这意味着操作并行进行,并且不能保证完成的顺序。$.ajax()的async选项默认为true,表示发出请求后可以继续执行代码。强烈反对将此选项设置为false(从而使调用不再异步),因为这会导致浏览器无响应
您可以阅读更多信息使用
承诺
也许?我也在寻找暂停代码或等待结果的方法,但我担心这可能不可能或几乎不可能。异步代码是在执行所有同步代码之后执行的,因此这将非常复杂。不,你真的不想阻止javascript执行并冻结页面。如果OP,像我一样,不喜欢?不,我可以打电话back@Vik也许在一个只有其中几个的小应用程序中就可以了。@ThisNameBetterBeAvailable:您链接的文章包含了如何避免混乱回调代码的答案。我不是在这里评论样式。OP有一个非常具体的错误,回调就是解决方法。避免回调地狱并不是不使用回调,而是以一种不混乱的方式编写回调。你永远不想用长时间运行的操作来阻止UI线程。@DavidHedlund好的,那么我误解了这个问题。我以为OP想要阻止一个非阻塞呼叫。对不起,我完全是个初学者。你能用我上面的代码来写吗?OP要求的是阻止非阻塞异步代码执行,而不是阻止异步代码执行后如何执行。另外,他想暂停代码并等待结果,他可能不想。我已经更新了我的答案并发布了一个JS fiddle演示
function format ( d )
{
var results;
$.ajax({
url: 'http://127.0.0.1:7101/MUDRESTService/rest/v1/feedbacks/' + d.FeedbackId + '/child/MudFeedbackDetailsVO?onlyData=true',
type: 'get',
dataType: 'json',
async:false,
success: function(output)
{
console.log(output.items[0].CriticalPath) ;
results = output.items[0];
}
});
return results.CriticalPath;
}