【问题标题】:Unable to figure out jQuery deferred done无法确定 jQuery 延迟完成
【发布时间】:2015-06-12 18:33:30
【问题描述】:

我是 jquery deferred 的新手,我在这里花了一段时间查看类似的问题,但无济于事。我可以使用一些帮助

我有一个获取表单输入值的函数和一个保存这些值的函数。在保存项目功能执行之前,表单输入值的抓取速度不够快。我试图通过使用 jquery deferred 来解决这个问题,但无法让它工作。我还尝试使用 .when 和 .done。 当我在我的 js 文件中硬编码参数时,尝试 2 有效,但当我在 onclick 或控制台中传递参数时无效。

任何帮助将不胜感激!

尝试 1:

function deferredTest1(w,x,y,z) {

    var d1 = $.Deferred();
    d1.done(function() {

    SaveNewItem(x,y,z);

});

function getFormValues(w) {
     $(w).each(function(i,obj) {
     var input = $(this).val();
     var inputID = $(this).attr('id');
     str = str.concat(",'"+inputID+"':'"+input+"'");  
     });

 }

 d1.resolve();

}

尝试 2:

function deferredTest2(w,x,y,z) {

    var formvalues = getFormValues(w);
    $.when(formvalues).done(SaveNewItem(x,y,z));
}

【问题讨论】:

  • 你是什么意思,他们“被抓得不够快”?抓住它们,然后保存。
  • 非常有帮助的评论,先生,非常感谢!你看,它们被存储在变量 str 中。问题是 getFormValues 函数没有在 SaveNewItem 函数之前执行。因此正在保存空值...
  • 为什么在保存新项目之前不执行?当你点击/提交/随便叫它那里。为什么要将它们存储在全局变量中?
  • 为什么不是我发布问题的原因。我将它们存储在一个全局变量中,因为我需要能够在我的 SaveNewItem 函数中传递该变量。
  • ... 这听起来像是 XY 问题。 问题 是您将它们存储在全局变量中,而不是在 实际上保存它们 时进行。你错过了我的意思:为什么你试图将它们保存在你实际使用它们的地方? 可能有一个实际的技术/业务原因,但在你明确说明它是什么之前,这似乎是一种非常复杂的方式来做一些微不足道的事情。

标签: javascript jquery jquery-deferred


【解决方案1】:

您的第二次尝试是最接近的。 $.when 调用需要延迟,所以我们先创建一个,然后在 $.when 调用中使用它。循环完成后在getFormValues方法中解决。此时then回调被执行。

var deferred = $.Deferred();
function deferredTest3(w,x,y,z) {
    $.when(deferred).then(function () {
        SaveNewItem(x,y,z);
    });
}
function getFormValues(w) {
    $(w).each(function(i,obj) {
        var input = $(this).val();
        var inputID = $(this).attr('id');
        str = str.concat(",'"+inputID+"':'"+input+"'");  
    });
    deferred.resolve();
}

这里没有异步操作,所以没有必要延迟。 deferred 用于管理各种异步请求及其相互依赖时的回调。

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多