jquery中done和then的区别(详解)

jQuery中done和then的区别(详解)

在使用jQuery的过程中,可能会遇到使用done()then()的情况。这两个方法在执行完成回调时看起来非常相似、可以互换,但它们之间却有一些细微的区别。

done()

done()方法是用来将一个成功的回调函数附加到一个已完成的异步操作上。它返回一个promise对象来处理异步操作的结果。当异步操作成功之后,回调函数会被执行。

下面是一个使用done()方法的示例:

$.ajax({
  url: 'https://jsonplaceholder.typicode.com/todos/1',
  method: 'GET',
}).done(function(response) {
  console.log('Title:', response.title);
}).fail(function(jqXHR, textStatus) {
  console.error('Error:', textStatus);
});

在上面的代码中,当AJAX请求成功时,回调函数会被触发,函数里会打印出返回数据里的标题。

then()

then()方法和done()方法类似,用来附加一个回调函数到一个异步操作上。但是和done()不同的是,then()方法可以接受两个回调函数作为参数:成功回调和失败回调。当异步操作完成时,若成功,则执行成功回调,否则执行失败回调。

以下是一个使用then()方法的示例:

$.ajax({
  url: 'https://jsonplaceholder.typicode.com/todos/1',
  method: 'GET'
}).then(function(response) {
  console.log('Title:', response.title);
}, function(jqXHR, textStatus) {
  console.error('Error:', textStatus);
});

在上面的代码中,如果AJAX请求成功,则会执行第一个回调函数,并打印标题。如果AJAX请求失败,则会执行第二个回调函数并打印错误信息。

区别

虽然done()then()功能非常相似,但它们之间有一些微小的区别:

  1. 返回值不同: done()返回一个新的、已完成的promise对象,而then()方法返回一个新的promise对象,可以通过它来进行链式操作。

  2. 参数不同: done()方法只接受一个参数,即成功的回调函数; 而then()方法接受两个参数,即成功回调和失败回调。

  3. 异常传递不同: 在使用done()方法时,如果在成功的回调函数中抛出异常,它将不会被传递到链式操作中。而在then()方法中,如果在成功回调函数中抛出异常,它会被传递到链式操作中的下一个then()方法或者最后的catch()方法。

示例

使用done()方法

$.ajax({
  url: 'https://jsonplaceholder.typicode.com/todos/1',
  method: 'GET'
}).done(function(response) {
  console.log('Title:', response.title);
  throw new Error('test');
}).done(function() {
  console.log('Maybe this code will not be executed'); // 不会执行
}).fail(function(jqXHR, textStatus) {
  console.error('Error:', textStatus);
});

在上面的代码中,虽然在第一个done()方法中抛出了一个异常,但是它不会被后面的回调函数捕获,所以第二个done()方法不会被执行。

使用then()方法

$.ajax({
  url: 'https://jsonplaceholder.typicode.com/todos/1',
  method: 'GET'
}).then(function(response) {
  console.log('Title:', response.title);
  throw new Error('test');
}).then(function() {
  console.log('Maybe this code will not be executed'); // 不会执行
}).catch(function(error) {
  console.error('Error:', error.message); // "test"
});

在上面的代码中,当在第一个then()方法中抛出异常时,它会被后面的catch()方法捕获。因此,第二个then()方法不会被执行。

总的来说,done()方法和then()方法在处理异步操作成功后的回调函数上非常相似,但在使用时还是需要注意它们之间的区别。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jquery中done和then的区别(详解) - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 如何使用jQuery获得焦点元素

    使用jQuery获得焦点元素,需要用到jQuery中提供的焦点相关的方法。具体步骤如下所示: 步骤1:引入jQuery库 首先需要在页面中引入jQuery库,例如: <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></s…

    jquery 2023年5月12日
    00
  • jQWidgets jqxDragDrop数据属性

    以下是关于“jQWidgets jqxDragDrop数据属性”的完整攻略,包含两个示例说明: 属性简介 jqxDragDrop 控件的数据属性用于在拖动过程中传递数据。该属性的值可以是任何类型的数据。属性的语法如下: $("#dragdrop").jqxDragDrop({ data: { key1: value1, key2: val…

    jquery 2023年5月10日
    00
  • jQWidgets jqxBarcode labelMarginTop属性

    jQWidgets jqxBarcode labelMarginTop属性 jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI件和工具,包括表格、图表、表单、历、菜等。其中,jqxBarcode是jQWidgets中的一个件,可以用于生成各种类型的条码。jqxBarcode提供了labelMarginTop属性,用于设置条形码标签与条形码…

    jquery 2023年5月9日
    00
  • jQWidgets jqxTreeGrid disabled属性

    jqxTreeGrid 是 jQWidgets 提供的一个树形表格组件,它可以展示层级结构的数据,并支持多种交互操作。jqxTreeGrid有一个 disabled 属性,用于禁用或启用组件。下面是 disabled 属性的详细讲解示例说明: disabled disabled 属性用于禁用或启用组件。它可以接受一个布尔值作为参数,表示是否禁用组件。如果设置…

    jquery 2023年5月11日
    00
  • PHP+Mysql+jQuery文件下载次数统计实例讲解

    这篇攻略主要介绍如何使用PHP、MySQL和jQuery实现文件下载次数的统计和展示。使用这种方式可以非常方便地统计文件的下载量,并且可以将结果展示在页面上,供用户查看。 准备工作 在开始编写代码之前,我们需要先准备一些工具和资源: PHP环境:确保你的服务器上已经安装了PHP。如果没有安装,可以从官网下载并安装。 MySQL数据库:用于存储下载次数的数据。…

    jquery 2023年5月27日
    00
  • jQWidgets jqxGauge LinearGauge orientation属性

    jQWidgets jqxGauge LinearGauge orientation属性 jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI组件和工具,包括表格、图、日历、菜单等。jqxGauge和jqxLinearGauge是jQWidgets中的两个组件,用于仪表盘和线性仪表盘。这两个组件都提供了orientation属性,用于设置组…

    jquery 2023年5月9日
    00
  • jQuery UI Resizable maxWidth选项

    以下是关于 jQuery UI Resizable maxWidth 选项的详细攻略: jQuery UI Resizable maxWidth 选项 jQuery UI Resizable maxWidth 选项用于设置 resizable 功能的最大宽度。该选项可以通过 resizable() 方法调用。 语法 $( ".selector&qu…

    jquery 2023年5月11日
    00
  • 解析jQuery与其它js(Prototype)库兼容共存

    一、题目解析 当一个网站同时使用jQuery和Prototype库时,可能会出现冲突或无法兼容的问题。解决这个问题的一种通用方法是在两个库之间使用noConflict()方法,但也需要注意一些细节。 二、解决方案 保证jQuery库在Prototype之前加载 在网页中确保jQuery库先于Prototype库被加载,如下所示: <script src…

    jquery 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部