3

我知道类似的问题已经发布了很多次,但是我已经阅读了很多,但找不到我的问题的答案。

我有一个等待 ajax 请求响应的函数。很多人会问为什么?好吧,我正在使用一个向导 Jquery 插件,它在离开步骤时执行一个函数,然后如果返回值为true,onLeaveAStepFunction向导将转到所选步骤;onLeaveAStepFunction否则它保持在同一步骤中。

我这样做是async: false为了等待,它可以工作,但这是一个糟糕的设计。另外,我不能使用 blockUI 插件。

我怎样才能做到这一点?

一些代码:

初始化向导:

$("#wizard").smartWizard({
        onLeaveStep : onLeaveStepFunction,
    });

调用ajax请求:

function onLeaveStepCallback(obj, context) {
    nextStep = sendForm();
}

ajax 请求:

var nextStep = false;
$.ajax({
    url : path,
    type : "POST",
    async : false,
    data : $("#" + idForm).serialize(),
    success : function(data) {
        $("#" + idDiv).html(data);
        nextStep = !$("#" + idHiddenErrores).val())
    }
});

省略属性。请帮我。

4

3 回答 3

0

一种变通的解决方法是在 leaveStep 之前执行此操作。也许在 showStep 上:

var wizard_next_step;
$("#wizard").smartWizard({
    onShowStep : function (obj, context) {
        onLeaveStepFunction(obj, context, function(nextStep){
            wizard_next_step = nextStep;
        });
    },
    onLeaveStep : function () {
        return wizard_next_step;
    }
});

您还需要修改您的onLeaveStepFunction以接受回调:

function onLeaveStepCallback(obj, context, callback) {
    nextStep = sendForm(callback);
}

然后你的ajax函数应该是:

$.ajax({
    url : path,
    type : "POST",
    async : false,
    data : $("#" + idForm).serialize(),
    success : function(data) {
        $("#" + idDiv).html(data);
        callback( !$("#" + idHiddenErrores).val()) );
    }
});

现在,看起来您正在使用以下内容进入向导窗口:

$("#" + idDiv).html(data);

我完全确定是否是这种情况。但如果是这样,那么您不能在这里执行此操作(显然因为它onShowStep会覆盖当前内容)。如果是这样,您应该在回调中传递数据:

success : function(data) {
    callback( data , !$("#" + idHiddenErrores).val()) );
}

像这样编写向导:

var wizard_next_step;
var wizard_data;
$("#wizard").smartWizard({
    onShowStep : function (obj, context) {
        onLeaveStepFunction(obj, context, function(data, nextStep){
            wizard_data = data;
            wizard_next_step = nextStep;
        });
    },
    onLeaveStep : function (obj, context) {
        $("#" + idDiv).html(wizard_data);
        return wizard_next_step;
    }
});

关键是在调用所有同步函数之前调用所有异步函数并获取数据。

注意:我根本不知道 smart-wizard,也不是一个认真的 jQuery 用户。上面的答案是基于我在 github 上阅读 smart-wizard 文档的 2 分钟以及我对 javascript 的理解。您肯定需要修改我的示例以使其正常工作。

于 2014-09-11T03:07:42.140 回答
0

您可以使用 jQuery 等待方法。我从文档页面举了一个例子来强调你是如何做到的:

$.when( $.ajax( "/request.php" ) ).done(function( response ) {
        // response argument resolved from ajax requests
        // process any work after ajax call finishes
}

文档页面的链接:

http://api.jquery.com/jquery.when/

于 2014-09-10T02:17:03.140 回答
0

我正在做这个 async: false for waiting 并且它可以工作,但这是一个糟糕的设计,我也不能使用 blockUI 插件。

除非您的向导设计得更好并且支持异步回调(例如,返回承诺的回调),否则async:false是您唯一的选择。

考虑切换到其他向导,并且不要忘记为您当前使用的插件提交错误。

于 2014-09-11T00:06:44.043 回答