ES6学习笔记12 Promise

JavaScript -- ES6的Promise 本文系统讲解了Promise在前端异步编程中的应用。首先分析回调函数的缺点(嵌套地狱),重点介绍Promise的实现原理:通过返回Promise对象和.then()链式调用实现异步顺序执行,并说明传参和错误处理机制。同时介绍了ES7的async/await语法糖,可消除.then()嵌套。还详细解析了Promise.all()和Promise.any()等原型方法的使用场景,通过商品查询案例演示其实际应用。最后预告将分享手写Promise的实现过程,帮助开发者深入理解异步编程原理。 阅读详情

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。

Promise对象具有两个特点:
(1)对象的状态不受外界影响。其具有三个状态:Pending(进行中)、Fulfilled(已成功)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。

创造一个Promise实例

const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

构造函数接受一个函数作为参数,该函数有两个参数,分别为resolve函数和reject函数(由JavaScript引擎提供),它们的作用就是将Promise对象的状态由”未完成”转变为”成功”或”失败”,并将相应的结果作为参数(value或error)传递出去

reject函数传递出去的值可以是一个Error对象

reject(new Error('error'));

注意,调用resolve或reject并不会终结 Promise 的参数函数的执行。因此最好在前面加上return语句,保证其后面的语句不会被执行

new Promise((resolve, reject) => {
  return resolve(1);
  // 后面的语句不会执行
  console.log(2);
})

使用方法

then()

创建了Promise实例之后,可以使用then()方法分别指定resolved状态和rejected状态的回调函数。第二个函数是可选的,这两个函数都接受Promise对象传出的值作为参数,返回一个新的Promise实例

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

下面是一个用Promise对象实现AJAX操作的例子

const getJSON = function(url) {
  const promise = new Promise(function(resolve, reject){  //创建promise对象
    const handler = function() {    //事件处理函数
      if (this.readyState !== 4) {   
        return;
      }
      if (this.status === 200) {   //如果结果成功返回,则将promise对象转变为完成状态
        resolve(this.response);
      } else {                       //结果返回失败,将promise对象转变为失败状态
        reject(new Error(this.statusText));
      }
    };
    const client = new XMLHttpRequest(); 
    client.open("GET", url);
    client.onreadystatechange = handler;    //绑定事件处理函数
    client.responseType = "json";
    client.setRequestHeader("Accept", "application/json");
    client.send();

  });

  return promise;
};

getJSON("/posts.json").then(function(json) {
  console.log('Contents: ' + json);
}, function(error) {
  console.error('出错了', error);
});

上面代码中,getJSON是对 XMLHttpRequest 对象的封装,用于发出一个针对 JSON 数据的 HTTP 请求,并且返回一个Promise对象。

由于then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。

getJSON("/posts.json").then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

采用链式的then,可以指定一组按照次序调用的回调函数。这时,前一个回调函数,有可能返回的还是一个Promise对象(即有异步操作),这时后一个回调函数,就会等待该Promise对象的状态发生变化,才会被调用。

getJSON("/post/1.json").then(function(post) {
  return getJSON(post.commentURL);
}).then(function funcA(comments) {
  console.log("resolved: ", comments);
}, function funcB(err){
  console.log("rejected: ", err);
});

当构造函数中resolve函数的参数为另一个Promise实例时,其回调函数会根据那一个Promise的状态来决定是否执行

const p1 = new Promise(function (resolve, reject) {
  setTimeout(() => reject(new Error('fail')), 3000)
})

const p2 = new Promise(function (resolve, reject) {
  setTimeout(() => resolve(p1), 1000)
})

p2
  .then(result => console.log(result))
  .catch(error => console.log(error))
// Error: fail

上述代码中,Promise对象p1在3秒后状态变为失败,而p2对象在1秒后返回p1。由于p2返回的是另一个Promise,导致p2自己的状态无效了,由p1的状态决定p2的状态。所以,后面的then语句都变成针对p1。又过了2秒,p1变为rejected,导致触发catch方法指定的回调函数。

catch()

也可以使用catch()方法,用于指定发生错误时的回调函数。其可以捕获在其之前抛出的错误,无论该错误出现在Promise创建过程还是then()方法的回调函数中。而对于then()方法,如果第一个回调函数参数执行发生错误,无法被第二个回调函数参数捕获

getJSON('/posts.json').then(function(posts) {
  // ...
}).catch(function(error) {
  // 处理 getJSON 和 前一个回调函数运行时发生的错误
  console.log('发生错误!', error);
});

Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。

getJSON('/post/1.json').then(function(post) {
  return getJSON(post.commentURL);
}).then(function(comments) {
  // some code
}).catch(function(error) {
  // 处理前面三个Promise产生的错误
});

跟传统的try/catch代码块不同的是,如果没有使用catch方法指定错误处理的回调函数,Promise对象抛出的错误不会传递到外层代码,即不会有任何反应。

const someAsyncThing = function() {
  return new Promise(function(resolve, reject) {
    // 下面一行会报错,因为x没有声明
    resolve(x + 2);
  });
};

someAsyncThing().then(function() {
  console.log('everything is great');
});

setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123

上面代码中,someAsyncThing函数产生的Promise对象,内部有语法错误。浏览器运行到这一行,会打印出错误提示ReferenceError: x is not defined,但是不会退出进程、终止脚本执行,2 秒之后还是会输出123。

catch()方法返回的还是一个promise对象,因此在其后还可以调用then()方法

const someAsyncThing = function() {
  return new Promise(function(resolve, reject) {
    // 下面一行会报错,因为x没有声明
    resolve(x + 2);
  });
};

someAsyncThing()
.catch(function(error) {
  console.log('oh no', error);
})
.then(function() {
  console.log('carry on');
});
// oh no [ReferenceError: x is not defined]
// carry on

finally()

finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。finally方法的回调函数不接受任何参数,这表明,finally方法里面的操作,应该是与状态无关的,不依赖 Promise的执行结果。

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

Promise.all() 和 Promise.race()

Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。Promise.all方法接受一个数组(任何具有 Iterator接口的对象都可以)作为参数,p1、p2、p3都是Promise实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。

const p = Promise.all([p1, p2, p3]);

p的状态由p1、p2、p3决定,分成两种情况:

  • 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
  • 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
// 生成一个Promise对象的数组
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
  return getJSON('/post/' + id + ".json");
});

Promise.all(promises).then(function (posts) {
  // ...
}).catch(function(reason){
  // ...
});

注意,如果作为参数的Promise实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法。

Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。与Promise.all()方法区别在于,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

const p = Promise.race([p1, p2, p3]);
const p = Promise.race([
  fetch('/resource-that-may-take-a-while'),
  new Promise(function (resolve, reject) {
    setTimeout(() => reject(new Error('request timeout')), 5000)
  })
]);

p
.then(console.log)
.catch(console.error);

上述代码,如果在5秒之内fetch('/resource-that-may-take-a-while')不返回结果,p的状态就变为失败

Promise.resolve() 和 Promise.reject()

Promise.resolve方法将现有对象转换为一个具有完成状态的Promise对象。

Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))

如果参数是一个Promise对象,则不做任何处理,直接返回。如果参数是一个具有then方法的对象,则会将其转换为Promise对象,并立即执行对象中的then方法。

let thenable = {
  then: function(resolve, reject) {
    resolve(42);
  }
};

let p1 = Promise.resolve(thenable);
p1.then(function(value) {
  console.log(value);  // 42
});

上面代码中,thenable对象的then方法执行后,对象p1的状态就变为resolved,从而立即执行最后那个then方法指定的回调函数,输出 42。

如果参数不是具有then方法的对象,或根本就不是对象,或没有参数,则Promise.resolve方法返回一个新的 Promise 对象,状态为resolved。

const p = Promise.resolve('Hello');

p.then(function (s){
  console.log(s)
});
// Hello
const p = Promise.resolve();

p.then(function () {
  // ...
});

需要注意的是,立即resolve的 Promise 对象,是在本轮“事件循环”(event loop)的结束时,而不是在下一轮“事件循环”的开始时。关于事件循环,强烈推荐这篇文章https://www.jianshu.com/p/12b9f73c5a4f

setTimeout(function () {
  console.log('three');
}, 0);

Promise.resolve().then(function () {
  console.log('two');
});

console.log('one');

// one
// two
// three

上面代码中,setTimeout(fn, 0)在下一轮“事件循环”开始时执行,Promise.resolve()在本轮“事件循环”结束时执行,console.log('one')则是立即执行,因此最先输出。

Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected。其接受参数与Promise.resolve类似

const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))

p.then(null, function (s) {
  console.log(s)
});
// 出错了

Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数。这一点与Promise.resolve方法不一致

const thenable = {
  then(resolve, reject) {
    reject('出错了');
  }
};

Promise.reject(thenable)
.catch(e => {
  console.log(e === thenable)
})
// true

应用

我们可以将图片的加载写成一个Promise,一旦加载完成,Promise的状态就发生变化。

const preloadImage = function (path) {
  return new Promise(function (resolve, reject) {
    const image = new Image();
    image.onload  = resolve;   //绑定加载成功时的事件处理函数
    image.onerror = reject;    //绑定加载失败时的事件处理函数
    image.src = path;
  });
};
Promise2012_前列腺MR图像.txt Promise2012_前列腺MR图像数据集,里面是百度网盘永久下载链接,深度学习使用,数据太大无法上传。如果链接失效,请私信我或者加我百度云2642828613@qq.com,第一时间补发。 立即下载

相关推荐

永磁同步电机解耦控制实战:从电流反馈到内模解耦的算法演进与选型指南

本文深入探讨了永磁同步电机高性能驱动中的核心挑战——交叉耦合问题,并对比分析了电流反馈解耦和内模解耦两大主流算法的原理、性能与适用场景。文章指出,电流反馈解耦动态响应快但对参数敏感,内模解耦鲁棒性更强但略有滞后,为工程师在不同应用需求下的算法选型提供了清晰的实战指南。

weixin_29039773的博客 265

【Promise12数据集】Promise12数据集介绍和预处理

数据集来源一个比赛Prostate MR Image Segmentation 2012。是一个广泛用于前列腺磁共振成像(MRI)分割的数据集。这个数据集最初是在2012年的MICCAI 'Prostate MR Image Segmentation’挑战赛中使用的,🚩目标是比较用于前列腺MRI的交互式和(半)自动分割算法。可以下载。官网下载地址在 Download里面。

cvxiayixiao的博客 5212

MATLAB出现”警告: 名称不存在或不是目录“的解决方案

MATLAB出现 警告: 名称不存在或不是目录 的解决方案1. 出现错误2. 问题解释3. 解决方法4. 特殊情况5. 问题解决6. 多多点赞交流 1. 出现错误 打开MATLAB突然发现,出现下面的错误: 提示我们不存在这样的路径。 2. 问题解释 这样的错误很明显,我们曾经在预设路径中添加了这个文件夹。 在某种情况下,我们把它删除了,现在MATLAB找不到它了。 (这里我在桌面上添加了新建文件夹,然后将其添加到MATLAB的搜索路径中。之后把新建文件夹删除了,所以就会出现这样的报错) 3. 解决方法

qq_18820125的博客 5万+

LA, ACDC, PROMISE12 数据集的数据处理方式

本文介绍了一些医学分割数据集(LA, ACDC, PROMISE12)的数据处理方式,为了将原来的数据处理为.h5

qq_45691955的博客 2950

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。 选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。 点击黑色小圆点,小圆点变绿,表示打断点成功。 此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。 点击编译,成功会弹出窗口显示编译成功,失败会在下方报错error,并显示错误的原因。 点击应用保存,选择yes to all就可以了。 点击用例执行就可以看到打断点情况下的执行结果了。

weixin_59334478的博客 2072

海康VisionMaster与西门子PLC1200进行S7通信

通信是连通算法平台和外部设备的重要渠道,在海康VisionMaster算法平台中既支持外部数据的读入也支持数据的写出,当通信构建起来以后既可以把软件处理结果发送给外界,又可以通过外界发送字符来触发相机拍照或者软件运行。 本文以西门子PLC1200作为外部设备为例,讲解海康VisionMaster与西门子PLC1200进行S7通信。......

haier123888的博客 1万+

12——promise自定义封装(更新中)

promise.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />

x1037490413的博客 294

FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇四

FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇四

坚韧与专注 2161

运行PROMISE12 Challenge - Automated Segmentation of Prostate Structures from MR Images项目遇到的坑

目前在学习深度图像处理,想把项目运行起来试试看,结果由于各种环境配置问题造成运行出错,实在对新手不友好啊。所以把环境配置遇到的大多数问题做一个整理,避免大家掉坑。 因为穷苦学生电脑没有GPU来训练跑,用CPU时间太长,所以直接用的.h5文件运行,没有进行训练,直接用的别人的训练结果进行测试。 对了这个深度图像学习的视频网站:https://www.bilibili.com/video/BV1iJ411G741?p=13&spm_id_from=pageDriver 讲的还挺不错的,老师人也

qq_41758969的博客 1065

树根互联Java开发面试题及参考答案

说一下 Java 集合类。 Java 集合类是用于存储和操作一组对象的容器。它提供了多种数据结构,方便程序员对数据进行高效的管理和处理。 Java 集合框架主要包括两大接口:Collection 和 Map。 Collection 接口是一组对象的集合,它有三个主要的子接口:List、Set 和 Queue。 List 接口代表有序的集合,可以包含重复的元素。例如 ArrayList,它是基于数组实现的动态数组。它的优点是随机访问效率高,通过索引访问元素的时间复杂度为 O (1)。当

大模型大数据攻城狮的专栏 856

wflow模型hbv

毛管水的处理 😄 快速流的处理 K4是为了产生基流的 找到了令人激动的kenematic模块 😄

m0_46268055的博客 778

ES6学习笔记(12)--promise的使用

引言:promise的出现就是为了解决回调地狱的问题(我瞎掰的)关于回调地狱,不懂自行百度。这里我大概讲一下 回调地狱:函数作为参数层层嵌套 开始学习: 这里申明三个函数No1No2No3 var status = 1; function No1(resolve,reject){ if(status ==1){ console.log('这是第一个函数')...

YmwWow的博客 269

RT-DETR改进策略【Conv和Transformer】| HiLo注意力机制 通过分离处理图像的高频和低频信息,高效处理图像特征

本文记录的是利用改进检测模型,针对目标检测中面临的多尺度特征融合效率与长距离依赖建模难题,HiLo注意力模块的引入旨在通过频率解耦策略优化高分辨率特征处理,将高频细节(如目标边缘)与低频语义(如场景结构)分离建模,提升目标检测精度。Fast Vision Transformers with HiLo AttentionHiLo注意力模块的提出源于对传统自注意力机制局限性的反思。传统多头自注意力(MSA)在处理高分辨率图像时存在以下问题:HiLo将注意力模块分为高频(Hi-Fi)和低频(Lo-Fi)两个分支,

Limiiiing的博客 818

ES6的Promise详解

本篇文章主要介绍了ES6语法中的Promise对象的使用详解,promise对象是JS进阶学习中的重要知识点,如果本文对你有所帮助请三连支持博主,你的支持是我更新的动力,先赞后看养成习惯。以下是本篇文章正文内容。

程序员柒的博客 6084

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ES6 - 从Promise入门到深入原理(手写一个自己的Promise)

事件和回调函数的缺陷 我们习惯于使用传统的回调或者事件处理来解决异步问题 事件: 某个对象的属性是一个函数, 当发生一件事时, 运行该函数 dom.onclick = function() { // ...执行的代码 } 回调:运行某个函数以实现某个功能的时候, 传入一个函数作为参数, 当某个特定的条件下的时候, 就会触发该函数 dom.addEventListner('click', ...

前端攻城狮Dannis 5268

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ES6-ES12知识点总结

ES6-ES12知识点总结 新特性

cxywcs的博客 1171

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ES6-ES12所有特性详解

文章目录第一章 ECMASript相关介绍1.1、什么是ECMA1.2、什么是ECMAScript1.3、什么是ECMA-2621.4、ECMA-262历史1.5、谁在维护ECMA-2621.6、为什么要学习ES61.7、ES6兼容性第二章 ES6特性=ES20152.1、let2.2、const2.3、变量的解构赋值2.4、模板字符串2.5、简化对象写法2.6、箭头函数2.7、rest参数2.8、扩展运算符2.9、Symbol2.10、迭代器2.11、生成器2.12、Promise2.13、Set2.14

wang13679201813的博客 4576

ES6——17. Promise对象

到了那个时候,Promise 的运行已经结束了,所以这个错误是在 Promise 函数体外抛出的,会冒泡到最外层,成了未捕获的错误。方法接受一个数组作为参数,数组的每个成员都是一个 Promise 对象,并返回一个新的 Promise 对象。这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。事件的监听函数有两个参数,第一个是错误对象,第二个是报错的 Promise 实例,它可以用来了解发生错误的环境信息。方法,依次指定了两个回调函数。

chtazycdf的博客 1708

ES6 - Promise

Promise是JavaScript中处理异步操作的容器,具有三种状态(pending、fulfilled、rejected),状态一旦改变不可逆转。它通过.then()链式调用处理成功结果,.catch()捕获错误,.finally()执行最终操作。Promise.all()处理多个Promise实例,全部成功才返回结果;Promise.race()则取最先完成的实例结果。Promise.resolve()将对象转为Promise。优点是状态管理清晰,缺点是无法取消、错误需显式捕获。适用于异步流程控制,如

m0_64387122的博客 793

JS ES6 Promise 之 Hello World

■前言最近学习VUE,涉及到了一些内容,都不了解,比如 Axios, Promise,所以,整理记录一下仅仅是一个【 简单 】的介绍,更多的内容,可以看看提供的文章链接,或是其他的资料。0.AxiosAxios,可以理解为ajax i/o system,这不是一种新技术,本质上还是对原生XMLHttpRequest的封装,可用于浏览器和nodejs的HTTP客户端,只不过它是基于Promise的,符合最新的ES规范。

sun0322 5219

详解ES6的Promise

异步操作处理:Promise用于处理需要等待时间较长的操作,如网络请求、文件读取等。通过Promise可以更清晰地表达异步操作的执行顺序和结果处理。状态:Promise有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已失败)。初始状态为pending,当操作成功完成时,状态变为fulfilled,如果发生错误,状态则变为rejected。then()方法:Promise对象的then()方法用于指定操作成功或失败时的回调函数。

rr20060119的博客 1268

es6 promise详解

基本概念 Promise是一个构造函数,自己身上有all、reject、resolve这几个眼熟的方法,原型上有then、catch等同样很眼熟的方法。这么说用Promise new出来的对象肯定就有then、catch方法喽,没错。 那就new一个玩玩吧。 var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('执行完成');

qq_40096030的博客 1569

ES6 Promise 对象

ES6 Promise 对象

m0_52913477的博客 1414

说说es6 promise async await 以及 promise A+规范的了解

Promise是 JavaScript 中用于处理异步操作的一种方式,它表示一个异步操作的最终完成(或失败)及其结果值的表示。Promise是 ES6 引入的,它通过链式调用来处理回调函数,避免了“回调地狱”的问题。async和await是 ES2017(ES8)引入的用于简化处理异步操作的语法糖。它们是基于Promise的,但使用起来更加简洁和直观。async:标记一个函数为异步函数,返回一个Promise对象。await:用于等待一个Promise对象的完成,await后面必须跟一个Promise。

HHX_01的博客 1179

ES6新标准下JS异步编程Promise解读

ES5及以下,要实现复杂的异步编程,需要大量运用回调函数,而每个回调函数中的执行正确与否无法及时判断,让你只能猜测或分析找问题,这将造成大量无法理解的情况出现。 ES6新标准引入Promise对上述问题进行解决,它的核心思想,是将上一次函数执行返回一个Promise对象,明确指示代码是否成功执行,则你可以基于此成功与否判断,以链式编程方式将复杂嵌套回调函数转换为简单流程化式的形式完成目标任务。

m0_74157361的博客 1747
上一篇: ES6学习笔记11 Reflect
下一篇: ES6学习笔记13 Iterator 和 for...of 循环
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值