我有js代码,它返回我的表的数据行。在单击每个行时,它们会展开并计划通过调用另一个ajax请求来显示该行的子数据。
我的子数据代码如下所示:
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;
}
问题可能是方法没有按结果的时间值完成。返回了CrititPath。我可以在chrome js控制台中看到值,因此数据部分没有问题。
那么一旦响应准备就绪,我应该如何让它返回值
答案 0 :(得分:1)
编写异步代码时,需要开始使用回调而不是返回值。
您的功能(如format
此处)仅启动操作。 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
}
});
}
答案 1 :(得分:1)
现在我没有对此发挥作用,但希望您能从代码示例中找到可以使用的内容。
我绑定.done() - 函数上的每一行,它调用另一个api。我希望这会有所帮助。
(function(){
//getJSON example
var jqxhr = $.getJSON( "https://api.myjson.com/bins/2emll", function(data) {
for (key in data) {
$("#list").append("<li class='" + key + "'>" + data[key] + "</li>");
}
}).done(function( data ) {
$("#list li").on("click", function(e){
var target = e.target.className;
//ajax example
$.ajax({
url: 'https://api.myjson.com/bins/309x5',
type: 'get',
data: target,
dataType: 'json',
success: function(data) {
var title = $("." + target).text();
$("." + target).html(title + '<ul id="ul-' + target + '"></ul>');
}
}).done(function(data){
for (key in data) {
$("#ul-" + target).append("<li class='" + key + "'>" + data[key] + "</li>");
}
});
});
});
})();
答案 2 :(得分:0)
您可以尝试将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。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用success / error / complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()。
Ajax中的第一个字母代表“异步”,意味着操作并行发生,并且无法保证完成顺序。 $ .ajax()的async选项默认为true,表示在发出请求后代码执行可以继续。强烈建议不要将此选项设置为false(从而使调用不再异步),因为它可能导致浏览器无响应。
您可以阅读更多信息here