Promise

Promise相关

1.Promise的概述

Promise实例一旦被创建就会被执行

Promise过程分为两个分支:pending => resolved和pending => rejected

Promise状态改变后,依然会执行之后的代码:

	let warnDemo = ctx => {  let promise = new Promise(resolve => {
    	resolve(ctx);    console.log("After resolved, but Run"); // 依然会执行这个语句
  		});  return promise;
	};
	warnDemo("ctx").then(ctx => console.log(`This is ${ctx}`));

2. Promise的状态

resolve : 将 Promise的状态设置为 fullfilled (已成功)
reject : 将 Promise 的状态设置为 rejected (已失败)
Promise 的状态 一旦改变, 不可更改。
下面是代码演示:

	let promise = new Promise((resolve, reject) => {
		//未完成
		reject("您失信了")
		//完成
		resolve("已经买过房子了")
	})
	console.log(promise)

3. Promise对象的创建方式

创建Promise对象有三种方式

  1. new Promise((resolve, reject) => {} ) :promise 的状态由回调函数来进行切换。
  2. Promise.resolve(data) : 快速构建一个 fulfilled 状态的 promise。
  3. Promise.reject(data) :快速构建一个 rejected 状态的 promise。

4. Promise#then 方法的特点

在resolve和reject都有的情况下,reject是不执行的。

then 会重新返回promise,两个函数,一个返回rresolve 一个返回reject。

	var p1= new Promise(function (resolve, reject) {
	resolve({
		data: [1, 2, 3, 4],
		resposneCode: "00001",
		resposneRemark: "成功"
	})

	reject({
		resposneCode: "00000",
		resposneRemark: "失败,遇到网络问题",
		data: [2]
	})

	}).then(function ({ data }) { return { data } }, function ({ data }) { return { data } });

	p1.then(function (data) { console.log(data) }, function ({ data }) { return { data } });

5. Promise 链式调用

then :
1. 处理 承诺 已完成的 业务
2. 更改 返回的 新的 promise 对象的状态
3. then 方法会返回一个 新的 promise 对象
4. then 方法的回调函数如果能被执行, 新的 promise 对象 状态由 回调函数 确定

  1. 如果回调函数产生异常, 则返回 rejected 状态的 promise
  2. 如果回调函数 没有 return ,则 返回 fulfilled 状态,并将 undefined 作为参数传给新的promise
  3. 如果回调函数 return 普通数据、则将 普通数据 作为 resolve 的 参数传给新的 promise
  4. 如果回调函数 return 一个 promise 对象,则then 返回的新的promise 对象状态和 return
    的promise对象状态完全一致

5.then 方法的回调函数如果不能执行,新的 promise 对象 和 调用 then 方法的 promise状态 完全一致

 	let th = p.then( res => {
		console.log(res)
		// 回调函数 return 的结果,会默认作为 fulfilled状态的 resolve() 函数的参数
		throw "error2" ;
	})
		console.log(th, "outter")
		setTimeout(function() {
			console.log(th,  "timeout")
			console.log(th === p)
		} , 0)	

6.Promise.resolve 传入的参数类型

Promise.resolve(arg) 快速的创建一个状态为 fulfilled的 promise
arg 参数的类型满足以下条件:

  1. arg是一个普通数据,会构建一个 fulfilled状态的 promise,并将 arg 的值 作为 resolve的参数
  2. arg 是 undefined, 会将 undefined 作为 resolve的参数,并返回 fulfilled状态的
    promise
  3. arg 是一个 thenable(某个对象中有 then 方法) 对象, 那么 会直接执行 then 方法,
    返回的promise对象状态由 then函数来确定
  4. arg 是一个promise 对象, 那么会返回一个 和 arg promise对象状态完全一致的 promise
    以下是代码演示:

arg是一个普通数据:

Promise.resolve(arg) //快速的创建一个状态为 fulfilled的 promise 

arg是undefined:

Promise.resolve().then(res=> console.log(res))

arg是一个thenable对象:

	let obj = {
		name: "zhangsan",
		then() {
		//console.log(this.name, "在说话")
		throw Error("error")
		}
	}		
	let p = Promise.resolve(obj)
	setTimeout( function(){
		console.log(p)
	 }, 0)

arg是一个promise 对象:

	let p = new Promise((resolve, reject)=> {
		reject("ok")
	})
	let p2 = Promise.resolve(p)
	setTimeout(function(){
		console.log(p2)
	})
上一篇:ResistoXplorer——基于Web的耐药基因组数据可视化,统计和探索新分析工具


下一篇:Promise