Javascript 使用延迟对象/承诺时Ajax调用返回失败
我只是对它失望了几个小时,需要一些真正的专家的帮助。 在下面的代码中,我希望单击带有classJavascript 使用延迟对象/承诺时Ajax调用返回失败,javascript,ajax,jquery,Javascript,Ajax,Jquery,我只是对它失望了几个小时,需要一些真正的专家的帮助。 在下面的代码中,我希望单击带有classfb\u detail\u btn的按钮后会附加从.ajax函数返回的数据结果。但是,发生的情况是,一旦ajax运行,以前非ajax附加的数据($(this).append(“aaaaaa”);)将始终被擦除我的测试显示php文件已经正确运行,所以问题是为什么ajax返回的数据不能被作为变量分配给$(this)。 JavaScript //GET FEEDBACK DETAIL METHOD// fun
fb\u detail\u btn
的按钮后会附加从.ajax函数返回的数据结果。但是,发生的情况是,一旦ajax运行,以前非ajax附加的数据($(this).append(“aaaaaa”);
)将始终被擦除我的测试显示php文件已经正确运行,所以问题是为什么ajax返回的数据不能被作为变量分配给$(this)。
JavaScript
//GET FEEDBACK DETAIL METHOD//
function get_feeback_detail(result) {
alert('inside get_feeback_detail, btn_clicked_id is '+btn_clicked_id);
return $.ajax ({
type: "POST",
url: "../x_get/get_feedback_detail.php",
data:{fb_id: btn_clicked_id},
}).then(function(data) {
alert('then ran!');
//loading_effect_hide();
var dataSplit = data.split("|");
commCode = dataSplit[0];
//alert(dataSplit[1]);
if(commCode !=1){
$('#testInfo').html(dataSplit[1]);
$('#testInfo').addClass("errorRed");
//$('.fb_review_table_section').empty();
alert('returned false for then in ajax!');
return false;
}else{
result =dataSplit[1];
}
alert('result inside then is... '+result);
//alert(selectedDiv.attr('class'));
//return result;
selectedDiv.append(result);
//loading_effect_hide();
}).fail(function(x,s,e) {
alert(s+": "+e);
alert('detail button failed!');// an error occurred
//alert(result);
});//$.ajax END
alert('inside get_feeback_detail, result is... '+result);
};//get_feeback_detail() END
//Detail Button
$(document).on('click','.fb_detail_btn',function(){
selectedDiv=$(this);
selectedDiv.append("<div>aaaaaa</div>");
elementPropertyName = selectedDiv.attr('name');
btnNames = $(this).attr("name").split("_");
btn_clicked_id=btnNames[1];
result="";
get_feeback_detail();
selectedDiv.append("<div>bbbbbbb</div>");
});
//获取反馈详细信息方法//
函数获取\u反馈\u详细信息(结果){
警报('inside get_feeback_detail,btn_clicked_id为“+btn_clicked_id”);
返回$.ajax({
类型:“POST”,
url:“../x\u get/get\u feedback\u detail.php”,
数据:{fb\u id:btn\u单击\u id},
}).then(功能(数据){
警惕(“然后跑!”);
//加载效果隐藏();
var dataSplit=data.split(“|”);
commCode=dataSplit[0];
//警报(数据分裂[1]);
如果(commCode!=1){
$('#testInfo').html(dataSplit[1]);
$('#testInfo').addClass(“errorRed”);
//$('.fb_review_table_section')。空();
警报('在ajax中返回false!');
返回false;
}否则{
结果=数据片段[1];
}
警报('内部结果为…'+结果);
//警报(selectedDiv.attr('class'));
//返回结果;
选择iv.追加(结果);
//加载效果隐藏();
}).失败(功能(x、s、e){
警报(s+“:”+e);
警报('详细信息按钮失败!');//发生错误
//警报(结果);
});//$.ajax结束
警报(“内部获取反馈详细信息,结果为…”+结果);
};//获取详细信息()结束
//细节按钮
$(文档).on('click','.fb_detail_btn',function(){
selectedDiv=$(此项);
选择iv.附加(“AAAAA”);
elementPropertyName=selectedDiv.attr('name');
btnNames=$(this.attr(“name”).split(“”);
btn_单击_id=btn名称[1];
结果=”;
获取详细信息();
选择iv.追加(“bbbbb”);
});
HTML
aadadadad
=更新=
目前,工作的结果将达到。然后,结果将不会被追加。您误用了承诺 您需要从
then()
回调返回新结果:
return $.ajax ({
type: "POST",
url: "../x_get/get_feedback_detail.php",
data: 'fb_id='+btn_clicked_id,
dataType:'json',//ACW-soemthing new!
}).then(function(data) {
...
return result;
});
此代码无法工作:
Ajax是异步的!正如您在警报中看到的,当该零件运行时,结果是未定义。它仅在回调中可用!阅读,并使用
我有点困惑什么时候接受btn\u clicked\u id作为get\u feeback\u detail中ajax的变量,但是从函数get\u feeback\u detail返回结果后,我应该将返回的结果放在哪里?当btn\u单击\u id时?我很困惑…@Chen:你不应该打电话给ajaxComplete。then()
回调在您得到响应后运行,您需要直接从中返回转换后的值。我刚刚再次更新,修复了失败问题,但仍然无法在数据出现时追加它。谢谢谢谢你的帮助,但更详细地说,我的工作确实需要字符串,但它不会加载到corosponding单元中。谢谢@陈:使用调试器来发现问题。可能是@Bergi的重复,我提出的解决方案实际上是受你提到的帖子启发的,但我认为我没有正确使用它。如果可以,请帮助我解决此特定问题,我将非常感激,然后使用.fail(函数(x,s,e){alert(s+”:“+e);})
查看它失败的原因,不仅仅是它失败了。可能您的服务器没有按预期响应,请在您的开发工具中使用网络检查器。@Bergi,新的更新版本可以工作,但仍然无法根据您的方法将结果附加到固定代码中,但我现在更困惑了。是否要运行selectedDiv.append(结果);里面。然后取出返回结果?我尝试了它并更新了代码,它仍然不起作用。你能帮我找到代码中的错误吗?我昨天做了很多个小时,我仍然找不到原因。是的,这正是我建议的。你是否尝试实际执行代码?我尝试了你的解决方案,但没有成功…当然我没有尝试,我不知道你的数据是什么。如果你不告诉我什么不起作用,我就帮不了你…
return $.ajax ({
type: "POST",
url: "../x_get/get_feedback_detail.php",
data: 'fb_id='+btn_clicked_id,
dataType:'json',//ACW-soemthing new!
}).then(function(data) {
...
return result;
});
return $.ajax ({
…
}).then(function(data) {
… // callback
return result;
}); //$.ajax END
alert('inside get_feeback_detail, result is... '+result);
selectedDiv.append(result);
return $.ajax ({
…
}).then(function(data) {
… // callback
// return result;
alert('inside ajax callback, result is... '+result);
selectedDiv.append(result); // works now!
});