浅谈js promise看这篇足够了

浅谈JS Promise

介绍

JS Promise是一种规范化的解决异步操作的方案,由于JS具有单线程、异步操作等特点,这使得JS Promise显得更加重要。在这篇文章中,我们将讨论JS Promise并提供示例。我们会通过以下步骤详细介绍JS Promise:

  1. Promise概念
  2. Promise状态
  3. Promise如何使用
  4. Promise示例1
  5. Promise示例2
  6. Promise常见问题

Promise概念

从大的概念上来说,Promise是一种处理异步操作的方式。 更具体的说,Promises是对具有不确定执行时间的异步操作的值或代理。 Promise通过向异步操作添加异步行为来改善代码可读性和可维护性。

Promise状态

Promise共有三种状态:pending(等待态),fulfilled(成功),rejected(失败)。

  1. pending(等待态):初始状态,既不是成功,也不是失败状态。
  2. fulfilled(成功):操作成功完成,promise的结果为value,这个状态称为"resolved"。
  3. rejected(失败):操作失败,接受到一个reason(表示Promise被拒绝的原因)

Promise状态转移图:

                  ┌─────────┐
                  │ pending │
                  └─────────┘
                        │
   ┌───────────────┬────┴────┬───────────────────┐
   │               │         │                   │
 ┌─┴─┐         ┌───┴───┐ ┌───┴───┐           ┌───┴───┐
 │Ful│         │Reject │ │ Fulfill│           │Rejet  │
 │fil│         │ ed    │ │ ment  │           │ ed    │
 └───┘         └───────┘ └───────┘           └───────┘

Promise如何使用

我们可以使用new Promise()构造函数来创建Promise对象,该构造函数接受一个参数一个函数,这个函数的两个参数是resolve和reject。当异步事件执行成功时,我们使用resolve()来通知Promise对象异步操作已成功完成,当异步事件执行失败并返回错误时,我们应该使用reject()。 示例代码:

var promise = new Promise(function(resolve, reject){
  // 异步操作
  if(异步操作成功){
    resolve(value)
  } else {
    reject(error)
  }
})

Promise对象的状态会在异步操作完成之后自动变为fulfilled或rejected。

在promise对象中可以通过then方法处理异步操作的成功和失败两种状态。then方法接受两个函数作为参数: 第一个函数是Promise成功时所使用的函数,第二个函数是Promise失败时所使用的函数。

promise.then(successFunction, failFunction)

Promise示例1

根据初始化状态,我们使用resolve和reject来设置异步操作的返回结果。

var promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve("异步操作成功");
  }, 2000);
});

promise.then(function(value) {
  console.log(value); // "异步操作成功"
}, function(error) {
  console.log(error);
});

console.log("程序执行结束");

上述示例中,我们使用setTimeout模拟异步操作。在2秒后,我们使用resolve设置Promise的成功状态。在then方法中,我们指定了一个成功函数,它将作为参数传递,并使用console.log()输出对应的结果字符串。最后,我们输出了一条程序执行结束的消息。

输出结果如下:

程序执行结束
异步操作成功

Promise示例2

下面的例子演示如何使用Promise实现异步操作。

function get(url) {
  return new Promise(function(resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.onload = function() {
      if (xhr.status === 200) {
        resolve(xhr.response);
      } else {
        reject(Error(xhr.statusText));
      }
    };
    xhr.onerror = function() {
      reject(Error("Network Error"));
    };
    xhr.send();
  });
}

get('https://api.github.com/users/hellojiayu')
.then(function(response) {
  console.log('success: ',response);
}, function(error) {
  console.log('error: ',error);
});

上述示例中,我们使用XMLHttpRequest对象访问api。如果请求成功,我们使用resolve方法返回response对象,并通过then函数的第一个参数传递。如果请求失败,我们使用reject方法返回错误信息,并通过then函数的第二个参数传递。

常见问题

如何处理多个Promise对象?

  1. 使用Promise.all():可以将多个Promise实例包装成一个新的Promise实例,成功的结果按顺序返回所有的操作结果,失败的结果则按照顺序返回失败原因:

Promise.all([promise1, promise2, promise3]).then(function(results){
//成功的回调函数
console.log(results)
}).catch(function(reason){
//失败的回调函数
console.log(reason)
});

  1. 使用Promise.race():只有一个Promise实例执行完毕,就返回它的结果:

Promise.race([promise1, promise2, promise3]).then(function(result) {
console.log(result);
});

如何中断Promise?

Promise对象不能被中断,但是我们可以在Promise执行成功或执行失败时,处理回调函数。

如何捕获Promise中的异常?

使用.catch()方法处理Promise抛出的异常。

var promise = new Promise(function(resolve,reject){
  throw new Error('promise error test')
})
promise.catch(function(error){
  console.log(error)
})

输出结果:

Error: promise error test

结论

在这篇文章中,我们探讨了JS Promise的概念,状态转移图和如何使用Promise。 我们还提供了两个使用Promise的示例,并解答了一些常见问题。 通过学习Promise,我们可以更好地处理异步事件,通过规范代码来增加可读性和可维护性,减少代码中的错误和难以跟踪的复杂性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈js promise看这篇足够了 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 详解node child_process模块学习笔记

    下面是详解node的child_process模块学习笔记的完整攻略。 什么是child_process模块 child_process模块是node.js核心模块之一,它提供了创建和管理子进程的功能。子进程是一个新的进程,由主进程创建,可以异步执行其他的Node.js脚本和系统命令。在使用child_process模块之前,我们需要先通过require引入…

    node js 2023年6月8日
    00
  • 浅谈高大上的微信小程序中渲染html内容—技术分享

    下面是“浅谈高大上的微信小程序中渲染html内容—技术分享”完整攻略。 1. 背景 随着微信小程序的不断发展,越来越多的开发者开始尝试在小程序中加载和渲染html内容,为用户呈现更加多样化、丰富的信息体验。但是,由于小程序和普通网页的差异性,导致小程序中渲染html内容的难度和复杂度较高。 2. 方案 2.1. 方案一:wxParse wxParse是一款基…

    node js 2023年6月8日
    00
  • node.js中的buffer.Buffer.byteLength方法使用说明

    让我来讲解一下“node.js中的buffer.Buffer.byteLength方法使用说明”的攻略。 一、Buffer.byteLength方法的定义与作用 Buffer.byteLength(string, [encoding])方法是node.js中Buffer构造函数的一个实例方法,用于返回一个字符串的字节长度。在计算字符串的字节长度时,可以指定字…

    node js 2023年6月8日
    00
  • 前端AI机器学习在浏览器中训练模型

    要在浏览器中进行前端AI机器学习的模型训练,可以通过TensorFlow.js这个JavaScript库来实现。下面是完整攻略: 第一步:准备数据集 在训练模型之前,首先需要准备好数据集,这通常是一个带有标签的数据集。可以利用已有的公共数据集(比如MNIST手写数字数据集),也可以自己收集数据。 第二步:加载数据集 需要将数据集加载到浏览器中,可以使用浏览器…

    node js 2023年6月8日
    00
  • 详解使用抽象语法树AST实现一个AOP切面逻辑

    使用抽象语法树AST实现AOP切面逻辑可以让我们在代码运行前或运行后织入一些额外的逻辑,以达到对代码进行横向扩展不修改代码本身的目的。下面是使用AST实现AOP切面逻辑的攻略。 什么是AST? 抽象语法树(Abstract Syntax Tree,AST)是一种树状结构,表示编程语言的语法结构。在编译期间,编译器会将源代码转换为AST,用于后续的代码生成等操…

    node js 2023年6月8日
    00
  • Node.js中DNS模块学习总结

    Node.js中DNS模块学习总结 DNS模块介绍 DNS 是 Domain Name System 的缩写,翻译为“域名系统”,它是将域名转换为 IP 地址的系统。在 Node.js 中提供了 DNS 模块来处理与域名相关的功能。 DNS 模块的使用方法 引入 DNS 模块 javascript const dns = require(‘dns’); 解析…

    node js 2023年6月8日
    00
  • 简单的Lua 连接操作mysql数据库的方法

    当我们需要将Lua应用程序连接到MySQL数据库时,可以使用Lua的luasql库。下面是一份完整的攻略,包括如何安装luasql库、连接MySQL数据库,以及如何使用Lua语言执行SQL查询和更新数据。 安装 Luasql 库 在使用Luasql之前,首先需要安装它。可以使用LuaRocks包管理器来安装。在终端中输入以下命令: luarocks inst…

    node js 2023年6月8日
    00
  • Node.js安装详细步骤教程(Windows版)详解

    Node.js安装详细步骤教程(Windows版)详解 介绍 Node.js是一款基于Chrome V8 JavaScript引擎的JavaScript运行环境,可以在服务器端运行JavaScript,也可以用来开发桌面应用程序。下面是Node.js在Windows系统上安装的详细步骤。 步骤 1. 下载安装包 打开Node.js的官方网站 https://…

    node js 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部