博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Promise
阅读量:5150 次
发布时间:2019-06-13

本文共 2221 字,大约阅读时间需要 7 分钟。

1.什么是Promise

Promise是异步编程的一种解决方案。

Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。(MDN)
Promise在设计上具有原子性,即只有三种状态:等待(Pending)、成功(Fulfilled)、失败(Rejected)。这让我们在调用Promise的异步方法时,逻辑变得非常简单,这在大规模的软件工程开发中具有良好的健壮性。(实战es2015)

2.基本语法

创建 Promise对象

new Promise( function(resolve, reject) {...} /* executor */  );

executor是带有 resolve 和 reject 两个参数的函数 。Promise构造函数执行时立即调用executor 函数, resolve 和 reject 两个函数作为参数传递给executor(executor 函数在Promise构造函数返回新建对象前被调用)。resolve 和 reject 函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)。executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled,或者在发生错误时将它的状态改为rejected。

如果在executor函数中抛出一个错误,那么该promise 状态为rejected。executor函数的返回值被忽略。

进行异步操作

  1. resolve(value) 方法控制的是Promise对象是否进入成功状态,一旦执行该方法并传入有且只有一个的返回值,Promise 便会从等待状态进入成功状态,Promise也不会再接收任何状态的改变。
  2. reject(reason) 方法控制的是Promise对象是否进入失败阶段,一旦进入失败状态就无法再改变。
  3. 一旦出现throw 语句,Promise对象便还会直接进入失败状态,并以throw语句的抛出值作为错误值进行错误处理。
let myFirstPromise = new Promise(function(resolve, reject){    //当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...)    //在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.    setTimeout(function(){        resolve("成功!"); //代码正常执行!    }, 250);});myFirstPromise.then(function(successMessage){    //successMessage的值是上面调用resolve(...)方法传入的值.    //successMessage参数不一定非要是字符串类型,这里只是举个例子    console.log("Yay! " + successMessage);});

3.方法

Promise.all(iterable)

返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。

var promise1 = Promise.resolve(3);var promise2 = 42;var promise3 = new Promise(function(resolve, reject) {  setTimeout(resolve, 100, 'foo');});Promise.all([promise1, promise2, promise3]).then(function(values) {  console.log(values);}).catch(err=>err);

Promise.race(iterable)

返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promis就会解决或拒绝。

var promise1 = new Promise(function(resolve, reject) {    setTimeout(resolve, 500, 'one');});var promise2 = new Promise(function(resolve, reject) {    setTimeout(resolve, 100, 'two');});Promise.race([promise1, promise2]).then(function(value) {  console.log(value);  // Both resolve, but promise2 is faster});// expected output: "two"

转载于:https://www.cnblogs.com/ikoala-zsd/p/9250328.html

你可能感兴趣的文章
未来的Web:让你惊叹的 Chrome 浏览器实验项目
查看>>
TCP系列22—重传—12、Forward Retransmit
查看>>
在某公司工作一年的自我总结01
查看>>
外煤关注:百度收购大部分糯米股份
查看>>
聚集索引和非聚集索引(整理)
查看>>
博弈---斐波那契博弈
查看>>
eclipse 项目转as项目时 .so文件 jniLibs的设置
查看>>
C#常见的异常
查看>>
apache中若干模块的安装
查看>>
(转)Android进程管理详解
查看>>
SpringBoot 基础
查看>>
ubuntu安装sublime-text
查看>>
Memcache命令及参数用法
查看>>
NET Core 拓展方法和中间件集合(支持NET Core2.0+)
查看>>
详解SpringMVC请求的时候是如何找到正确的Controller
查看>>
构建第一个 Spring Boot 工程
查看>>
Net Core中使用Newtonsoft.Json进行序列化保持原有大小写
查看>>
MySQL登录报错"Access denied for user 'root'@'localhost' (using password: YES)"
查看>>
[HNOI2017]大佬
查看>>
js获取当前iframe的ID
查看>>