【发布时间】:2015-03-18 23:01:23
【问题描述】:
我有一个按钮,点击它会打开一个模式(dashboard_name),用户可以在其中输入一些值。根据他在该模态上单击提交后的值,我调用另一个函数,该函数打开另一个模态,用户在那里输入不同的值,最后当他在该模态上单击提交时,我调用一个 api 来验证一切是否正确。
现在,问题是当我单击第一个按钮打开模态时,执行不会等待函数从dashboard_name 模态然后从graph_name 模态获取数据。相反,它直接跳转到 api 函数调用,这是正确的,因为这就是 jQuery 的工作方式。但我想知道如何使用 deferred 和 promise 使这个执行串行。
单击第一个按钮时的功能。
$('#add_to_dash').click(function(e){
dashboard_submit();
graph_submit();
});
此函数获取仪表板模式并尝试获取值。
function dashboard_submit(){
//do something
}
dashboard_submit 函数成功后的此函数尝试获取图形模式的值
function graph_submit(){
//do something
}
然后在提交表单时,我将其称为以下函数
<form name="form2" onsubmit="return isDashboardCorrect(dashboard_name);" method="post" action="{{ url_for('dashboards_new') }}">
功能
function isDashboardCorrect(dashboard_name) {
var flag=0;
$.ajax({
async: false,
type: 'GET',
url: 'xyz.com/dashboard/'+dashboard_name,
success: function(data) {
//alert(data);
//do something
});
}
我希望所有这些都是顺序的,这现在不会发生,即当我单击第一个按钮时,它不会等待函数执行并直接调用 isdashboardcorrect() 函数。
我希望订单是 1.按钮点击 2.dashboard_submit() 3.graph_submit() 4. isdashboardcorrect() 连载。
我尝试了一些更简单的方法,例如
$('#add_to_dash').click(function(e){
alert('addtodashstart');
dashboard_submit().done(function(){
alert('done');
});
alert('addtodashend');
});
function dashboard_submit()
{
alert('dashboardsubmot');
var dfd = new $.Deferred();
$("#d_name_modal_div").modal({backdrop: false}).modal("show");
$('#d_name_modal_submit').on('click', function(){
dashboard_name=$('#dashboard_name').val();
alert(dashboard_name);
if(dashboard_name==null || dashboard_name.trim()=='')
{
alert('Dashboard name is mandatory.');
return false;
}
else
{
dfd.resolve();
return dfd.promise();
}
});
}
当我点击按钮时,我调用了dashboard_submit 函数。 但是这里也不需要等待
`$('#d_name_modal_submit').on('click', function(){
this在上面的函数中执行,直接命中api函数。我做错了什么?`
【问题讨论】:
-
在 Javascript 中,您不能“暂停”执行以等待异步操作完成。相反,您必须使用异步通知回调进行编码,以便在完成 Ajax 调用时完成您的操作。这是一种不同的编码方式,但一旦你学会了并不难。
-
你能指出我正确的方向吗?如果您知道任何博客或示例?
-
这么多代码,很少有人能读懂整件事。只需将第二个调用嵌套在第一个 ajax 调用的成功回调中或通过
jQuery.Deferred同步这两个调用 -
是否有任何关于延迟的简单教程,我很难理解这个概念,因为我对 jscript 很陌生。
-
给我几分钟,我会给你一个模拟示例
标签: jquery promise jquery-deferred