promiseA+规范及实现

Promise表示一个异步操作的最终结果。与Promise最主要的交互方法是通过将函数传入它的then方法从而获取得Promise最终的值或Promise最终被拒绝(reject)的原因。

1.术语

promise是一个包含了兼容promise规范then方法的对象或函数,
thenable是一个包含了then方法的对象或函数。
value是任何Javascript值。 (包括 undefined, thenable, promise等)。
exception是由throw表达式抛出来的值。
reason 是一个用于描述Promise被拒绝原因的值。

2.要求

2.1 Promise状态

一个Promise必须处在其中之一的状态:pending, fulfilled 或 rejected.

  • 如果是pending状态,则promise:
    1.可以转换到fulfilled或rejected状态。
  • 如果是fulfilled状态,则promise:
    1. 不能转换成任何其它状态。
    2. 必须有一个值,且这个值不能被改变。
  • 如果是rejected状态,则promise可以:
    1. 不能转换成任何其它状态。
    2. 必须有一个原因,且这个值不能被改变。

2.2 then方法

一个Promise必须提供一个then方法来获取其值或原因。
Promise的then方法接受两个参数:

promise.then(onFulfilled,onRejected)

  1. onFulfilledonRejected都是可选参数,如果onFulfilled或者onRejected不是一个函数,则忽略。
  2. 如果onFulfilled是一个函数:1.它必须在promisefulfilled后调用,且promise的value为其第一个参数。2.它不能被多次调用
  3. 如果onRejected是一个函数:1.它必须在promiserejected后调用, 且promise的reason为其第一个参数。2.不能被多次调用。
  4. 都只允许在ececution context栈仅包含平台代码时运行
  5. 都必须当做函数调用
  6. 对于一个promise,它的then方法可以调用多次。所有的onFulfilled或者onRejected都必须按照其注册顺序执行。
  7. then必须返回一个promise

1.什么是Promise?

Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一

2.对于几种常见异步编程方案

  • 回调函数
  • 事件监听
  • 发布/订阅
  • Promise对象
这里就拿回调函数说说

1.对于回调函数 我们用Jquery的ajax获取数据时 都是以回调函数方式获取的数据

$.get(url, (data) => {
    console.log(data)
)

2.如果说 当我们需要发送多个异步请求 并且每个请求之间需要相互依赖 那这时 我们只能 以嵌套方式来解决 形成 "回调地狱"

$.get(url, data1 => {
    console.log(data1)
    $.get(data1.url, data2 => {
        console.log(data1)
    })
})

这样一来,在处理越多的异步逻辑时,就需要越深的回调嵌套,这种编码模式的问题主要有以下几个:

  • 代码逻辑书写顺序与执行顺序不一致,不利于阅读与维护。
  • 异步操作的顺序变更时,需要大规模的代码重构。
  • 回调函数基本都是匿名函数,bug 追踪困难。
  • 回调函数是被第三方库代码(如上例中的 ajax )而非自己的业务代码所调用的,造成了 IoC 控制反转。
Promise 处理多个相互关联的异步请求

1.而我们Promise 可以更直观的方式 来解决 "回调地狱"

const request = url => { 
    return new Promise((resolve, reject) => {
        $.get(url, data => {
            resolve(data)
        });
    })
};

// 请求data1
request(url).then(data1 => {
return request(data1.url);
}).then(data2 => {
return request(data2.url);
}).then(data3 => {
console.log(data3);
}).catch(err => throw new Error(err));

2.相信大家在 vue/react 都是用axios fetch 请求数据 也都支持 Promise API

import axios from 'axios';
axios.get(url).then(data => {
   console.log(data)
})

你可能感兴趣的:(前端总结,promiseA+规范,promise实现)