ES6 promise 浅谈

简介: ES6 promise 浅谈

写在文本前:本文不讲概念,不谈基本思想,关于promise的基本知识可以自行百度查阅,这里主要是说一下关于promise我们在日常使用中忽略的或者需要理解的知识点。

1、什么是promise

我们在浏览器打印出Promise(console.dir(Promise)),看看Promise到底是什么,输出结果如下:


image.png

11111.png


从打出来的结果可以看出,Promise是一个构造函数,自己身上有all、resolve、reject这几个眼熟的方法,原型上有then、catch、finally等方法。

2、创建Promise实例

要想创建一个promise对象、可以使用new来调用Promise的构造器来进行实例化。如下:

var promise = new Promise(function(resolve, reject) {
   // 异步处理,处理结束后、调用resolve 或 reject
   if (/* 异步操作成功 */){
     resolve(value);
   } else {
     reject(error);
   }
});

除了上面的方法我们还可以使用Promise.resolve 和 Promise.reject这两个方法创建实例,这两个静态方法Promise.resolve(value),Promise.reject(value)  可以认为是 new Promise() 方法的快捷方式。创建方式如下(以resolve为代表创建,reject同理):

new Promise(function(resolve){
    resolve(100);
});
//使用情况
Promise.resolve(100).then(function(value){
    console.log(value);
});

3、 Promise只能进行异步操作?

在使用Promise.resolve(value)等方法的时候,如果promise对象立刻就能进入resolve状态的话,那么你是不是觉得 .then 里面指定的方法就是同步调用的呢?

实际上,.then中指定的方法调用是异步进行的。看下边代码,先思考下打出来的信息顺序是什么?

var promise = new Promise(function (resolve){
    console.log("inner promise"); // 1
    resolve(42);
});
promise.then(function(value){
    console.log(value); // 3
});
console.log("outer promise"); // 2
//打印出来的顺序是:
//inner promise
//outer promise
//42

由于JavaScript代码会按照文件的从上到下的顺序执行,所以最开始 <1> 会执行,然后是 resolve(42); 被执行。这时候 promise 对象的已经变为确定状态,FulFilled被设置为了 42 。照理说应该是打印出console.log(42)最后是console.log("outer promise");但是看结果却不是这样的,而是函数2比函数3先执行,到这里我想你也就明白了,即使在调用 promise.then 注册回调函数的时候promise对象已经是确定的状态,Promise也会以异步的方式调用该回调函数,这是在Promise设计上的规定方针。即:promise.then永远是以异步调用。

4、每次调用then都会返回一个新创建的promise对象

在使用过程中我想大家已经认识了 .then().catch() 这种链式方法的写法了,其实在Promise里可以将任意个方法连在一起作为一个方法链(method chain)。你可以无限的这样使用下去,比如promise.then().then().then().catch()这样,但是你有没有想过promise链式调用返回给下一步的数据是什么?

var  p = new Promise(function(resolve,reject){
    resolve("aaa")
})
var test = p.then(function(value){
  console.log(value)
})
console.dir(test)

想一下上面的console.dir(test)打出来是什么?没错是一个promise对象,如下图


image.png

2222.png

5、promise.then().then().then()....这样链式调用,后边的一个then()的值是谁传递的?

// 1: 对同一个promise对象同时调用 `then` 方法
var aPromise = new Promise(function (resolve) {
    resolve(100);
});
aPromise.then(function (value) {
    return value * 2;
});
aPromise.then(function (value) {
    return value * 2;
});
aPromise.then(function (value) {
    console.log("1: " + value); // => 100
})
// vs
// 2: 对 `then` 进行 promise chain 方式进行调用
var bPromise = new Promise(function (resolve) {
    resolve(100);
});
bPromise.then(function (value) {
    return value * 2;
}).then(function (value) {
    return value * 2;
}).then(function (value) {
    console.log("2: " + value); // => 100 * 2 * 2
});
//2个实例的输出值是
//1: 100
//2: 400

第1种写法中并没有使用promise的方法链方式,这在Promise中是应该极力避免的写法。这种写法中的 then 调用几乎是在同时开始执行的,而且传给每个 then 方法的 value 值都是 100 。

第2中写法则采用了方法链的方式将多个 then 方法调用串连在了一起,各函数也会严格按照 resolve → then → then → then 的顺序执行,并且传给每个 then 方法的 value 的值都是前一个promise对象通过 return 返回的值。

相关文章
|
4月前
|
前端开发
理解 ES6 中的 Promise
【10月更文挑战第24天】ES6 中的 Promise 是一种用于处理异步操作的机制,它提供了一种更优雅、更可控的方式来处理异步任务的结果。Promise 可以看作是对异步操作结果的一种承诺,它可以处于三种不同的状态:Pending(等待中)、Fulfilled(已完成,即成功)和 Rejected(已拒绝,即失败)。
|
5月前
|
前端开发 JavaScript 小程序
JavaScript的ES6中Promise的使用以及个人理解
JavaScript的ES6中Promise的使用以及个人理解
55 1
|
5月前
|
前端开发 Java
说说你对es6中promise的理解?
说说你对es6中promise的理解?
24 1
|
5月前
|
前端开发 Java
说说你对es6中promise的理解?
说说你对es6中promise的理解?
|
7月前
|
前端开发
手写实现ES6的Promise.all()和Promise.race()函数
这篇文章介绍了如何手写实现ES6的`Promise.all()`和`Promise.race()`函数,提供了实现这两个Promise聚合函数的详细代码示例,并展示了如何使用它们。
手写实现ES6的Promise.all()和Promise.race()函数
|
6月前
|
前端开发 JavaScript
ES6新标准下JS异步编程Promise解读
ES6新标准下JS异步编程Promise解读
56 3
|
5月前
|
存储 前端开发 JavaScript
关于 ES6 中 Promise 的面试题
关于 ES6 中 Promise 的面试题
36 0
|
8月前
|
前端开发 JavaScript
ES6 中 Promise对象使用学习
ES6 中 Promise对象使用学习
63 1
|
7月前
|
前端开发 JavaScript
ES6新特性(五):Promise优雅地处理异步
ES6新特性(五):Promise优雅地处理异步
|
9月前
|
JSON 前端开发 JavaScript
ES6引入Promise和async/await解决异步问题
【6月更文挑战第12天】ES6引入Promise和async/await解决异步问题。Promise处理异步操作,有pending、fulfilled、rejected三种状态,支持链式调用和并行处理。async/await是基于Promise的语法糖,使异步代码更同步化,提高可读性。两者都是处理回调地狱的有效工具,开发者应根据需求选择合适的方式。
68 3