Promise表示一个异步操作的最终结果。与Promise最主要的交互方法是通过将函数传入它的then方法从而获取得Promise最终的值或Promise最终被拒绝(reject)的原因。
promise
是一个包含了兼容promise规范then方法的对象或函数,
thenable
是一个包含了then方法的对象或函数。
value
是任何Javascript值。 (包括 undefined, thenable, promise等)。
exception
是由throw表达式抛出来的值。
reason
是一个用于描述Promise被拒绝原因的值。
一个Promise必须处在其中之一的状态:pending, fulfilled 或 rejected.
then
方法一个Promise必须提供一个then方法来获取其值或原因。
Promise的then方法接受两个参数:
promise.then(onFulfilled,onRejected)
onFulfilled
和onRejected
都是可选参数,如果onFulfilled
或者onRejected
不是一个函数,则忽略。onFulfilled
是一个函数:1.它必须在promise
fulfilled后调用,且promise
的value为其第一个参数。2.它不能被多次调用onRejected
是一个函数:1.它必须在promise
rejected后调用, 且promise
的reason为其第一个参数。2.不能被多次调用。promise
,它的then方法可以调用多次。所有的onFulfilled
或者onRejected
都必须按照其注册顺序执行。then
必须返回一个promisePromise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一
1.对于回调函数 我们用Jquery的ajax获取数据时 都是以回调函数方式获取的数据
$.get(url, (data) => {
console.log(data)
)
2.如果说 当我们需要发送多个异步请求 并且每个请求之间需要相互依赖 那这时 我们只能 以嵌套方式来解决 形成 "回调地狱"
$.get(url, data1 => {
console.log(data1)
$.get(data1.url, data2 => {
console.log(data1)
})
})
这样一来,在处理越多的异步逻辑时,就需要越深的回调嵌套,这种编码模式的问题主要有以下几个:
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)
})