【问题标题】:jquery 1.5.1 Deferred Object .when() .then() Confusionjquery 1.5.1 延迟对象 .when() .then() 混淆
【发布时间】:2011-02-28 17:28:27
【问题描述】:

我有两个从 .net 3.5 页面返回日期的网络方法。
每个都分别返回一个开始和结束日期字符串。
我尝试打电话给他们,然后在他们都完成后输出他们的结果作为警报作为一个简单的测试,但我不能成功地做到这一点。
当我单步执行我的代码时,会在填充全局变量之前显示警报。一旦显示警报,变量就会被填充。 我做错了什么?

<script type="javascript">
var startDate, endDate;

$(document).ready(function(){
   $.when(GetStartDate(), GetEndDate()).then(Output());
});

function GetStartDate(){
   return $.ajax({
   type="POST",
   url="myurl/page.aspx/GetStartDate",
   data = {},
   contentType="json",
   success: function(data){ startDate = data.d.toString();},
   failure:failureAlertMsg
  });
}

function GetEndDate(){
   return $.ajax({
   type="POST",
   url="myurl/page.aspx/GetEndDate",
   data = {},
   contentType="json",
   success: function(data){ endDate = data.d.toString();},
   failure:failureAlertMsg
  });
}

function Output(){
    alert('StartDate: ' + startDate + '\nEndDate: ' + endDate');
}
</script>

【问题讨论】:

  • jQuery 1.5.2?!你的意思是 1.4.2 或 1.5.1,对吗?
  • 您的问题中的语法错误是否也在您的实际代码中?

标签: jquery jquery-deferred


【解决方案1】:

你正在立即执行 GetStartDate、GetEndDate 和 Output 这些函数,我认为这不是你想要的。

我不熟悉新的 Deferred 对象功能,但我的猜测是您希望将引用传递给函数,然后它将在适当的时间执行该函数。在您的情况下,您是说立即执行此功能,因此您的警报会立即发生,并且您还会看到您的 ajax req 立即发生,但由于 ajax 的异步性质,您可能不会注意到。

类似

$.when(GetStartDate, GetEndDate).then(Output);

可能更合适?

附加信息

如果您阅读.thenjquery docs,您会发现它应该提供donefailure 回调,因为您只是提供一个回调,所以我会改用done

$.when(GetStartDate, GetEndDate).done(Output);

我也不知道延迟对象是如何工作的,但我会先使用控制台记录一些消息。例如,在您的 ajax 函数的每个成功回调中执行类似 console.log("&gt;&gt; GetStartDate:success()") 或类似的操作,因此您可以查看成功函数是否被正确调用。延迟对象是否仍会调用您的 ajax 函数的 success 回调?我找不到这方面的信息,但可能是它实际上将这些值传递给了您的 done 回调函数并且您访问了那里的所有内容?不完全确定。

【讨论】:

  • @Nyuszika7H,是的,我的意思是 1.5.1
  • @Matt,我确实必须手动将代码从一台机器输入到另一台机器,但我想我没有看到你看到的语法错误。我是 jQuery 新手,请多多指教
  • 我确实尝试过你的建议,但没有运气。这些值在警报框中显示为“未定义”。一旦我单击警报中的“确定”按钮,当我单步执行时就会填充变量
  • 我发现了这个:jsfiddle.net/ehynds/Mrqf8 所以我把对 Output() 的调用包装在一个 function(){Output()} 中,现在它可以工作了。我感谢您的努力,因此我将布拉德标记为答案。顺便说一句,我曾尝试使用 .done() 但没有得到预期的响应
【解决方案2】:

感谢这篇文章,我明白了:http://jsfiddle.net/ehynds/Mrqf8/

我所做的是编辑这个:

$(document).ready(function(){    
  $.when(GetStartDate(), GetEndDate()).then(Output()); 
});

到这里:

$(document).ready(function(){    
  $.when(GetStartDate(), GetEndDate())
    .then(function(){
      Output();
    })
    //additional option, not required
    .fail(function(){
      alert:'Failed!');
  })
});

【讨论】:

  • 那和.then(successFunction, failedFunction),如果你想减少意外关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
相关资源
最近更新 更多