为什么JQuery.getJSON()函数有success和done两个函数?

14

JQuery的getJSON文档展示了一个例子:

var jqxhr = $.getJSON( "example.json", function() {
  console.log( "success" );
})
  .done(function() {
    console.log( "second success" );
  })
  .fail(function() {
    console.log( "error" );
  })
  .always(function() {
    console.log( "complete" );
  });

success函数(作为第二个参数传递)和done()函数之间有什么区别?它们看起来是一样的。


http://api.jquery.com/jQuery.ajax/ - Dave Newton
这个问题似乎不适合讨论,因为它涉及到为什么jQuery被设计成特定的方式。 - Erik Philips
7
我认为这不是离题。发帖人想知道两种方法之间是否有区别。 - Ruan Mendes
2
@JuanMendes 谢谢,是的。根本问题不在于为什么两者都存在,而在于通过其中一个或另一个被调用是否有任何区别。 - David Thielen
2个回答

13

最初,jQuery的异步函数没有返回承诺(Promise),必须使用回调。

然后他们添加了deferred (promise)系统,但为了兼容性和因为不是每个人都喜欢deferred,他们保留了回调。

来自Deferred对象文档

在JavaScript中,通常会调用可选接受回调的函数。例如,在jQuery 1.5之前的版本中, 像jQuery.ajax()这样的异步进程接受回调函数,在将来某个时刻成功、错误或完成ajax请求时将回调函数调用。

jQuery.Deferred()引入了多项增强功能,以管理和调用回调。 特别是,jQuery.Deferred()提供了灵活的方法来提供多个回调,并且这些回调可以被调用,无论原始回调分派是否已经发生。 jQuery Deferred基于CommonJS Promises/A设计。


4
它们是同一件事。done函数的作用类似于Promise,这样您就可以从ajax调用的结果中安装处理程序。即使在异步调用完成后调用done(通过存储返回值),它也能正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接