promise常用使用方法

Promise

Promise 对象用于表示一个异步操作的最终完成 (或失败), 及其结果值.

语法

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

executor是带有 resolve 和 reject 两个参数的函数 。

描述

Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象。
主要有以下几种状态:
pending:初始状态,既不成功,也不是失败,
fulFilled:成功,
rejected:失败,

属性

Promise.length:length属性,其值总是为 1 (构造器参数的数目)。
Promise.prototype:表示 Promise 构造器的原型。

方法

Promise.all(iterable)

promise.all(iterate)方法返回一个Promise实例,当iterate中所有参数都完成才会回调,如果失败是返回第一个失败的原因;(iterable:一个可迭代的对象,如array,string)

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);
});
// [3, 42, "foo"]
说明:在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组,
它包含所有的传入迭代参数对象的值(也包括非 promise 值)。
Promise.race(reason)

Promise.race(iterable):返回一个promise,一旦迭代器中的某个promise解决或则拒绝,返回的promise就会解决或者拒绝。

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)
});
//  "two"
Promise.reject(reason)

Promise.reject(reason)方法返回一个带有拒绝原因reason参数的Promise对象
reason:表示被拒绝的原因

Promise.reject("Testing static reject").then(function(reason) {
 // 未被调用
}, function(reason) {
 console.log(reason); // "Testing static reject"
});

Promise.reject(new Error("fail")).then(function(result) {
 // 未被调用
}, function(error) {
 console.log(error); // stacktrace
});
Promise.resolve(value)

Promise.resolve(value)方法返回一个以给定值解析后的Promise对象。如果该值为promise,返回这个promise;如果这个值是thenable(即带有"then" 方法)),返回的promise会“跟随”这个thenable的对象,采用它的最终状态;否则返回的promise将以此值完成。

var promise1 = Promise.resolve(123);
promise1.then(function(value) {
 console.log(value);//123
});

数组
var p = Promise.resolve([1,2,3]);
p.then(function(v) {
 console.log(v[0]); // 1
});
Promise 链式操作
1链式catch方法
var p1 = new Promise(function(resolve, reject) {
 resolve('Success');
})
p1.then(function(value) {
 console.log(value); // "Success!"
 throw 'oh, no!';
}).catch(function(e) {
 console.log(e); // "oh, no!"
}).then(function(){
 console.log('after a catch the chain is restored');
}, function () {
 console.log('Not fired due to the catch');
})

捕获抛出的错误
var p1 = new Promise(function(resolve, reject) {
 throw 'Uh-oh!';
});
p1.catch(function(e) {
 console.log(e); // "Uh-oh!"
});
2finally()

finally() 虽然与 .then(onFinally, onFinally) 类似,它们不同的是:
Promise.resolve(2).then(() => {}, () => {}) //结果是undefind
Promise.reject(2).then(() => {}, () => {})//结果是undefind
Promise.resolve(2).finally(() => {})//结果是2
Promise.reject(2).then(() => {}, () => {})//结果是2

链式三个一起应用
let isLoading = true;
fetch(myRequest).then(function(response) {
    var contentType = response.headers.get("content-type");
    if(contentType && contentType.includes("application/json")) {
      return response.json();
    }
    throw new TypeError("Oops, we haven't got JSON!");
  })
  .then(function(json) { /* process your JSON further */ })
  .catch(function(error) { console.log(error); })
  .finally(function() { isLoading = false; });
### Promise常用方法详解 JavaScript 中的 `Promise` 提供了多种方法用于处理异步操作,包括创建、组合和控制多个 Promise 的执行流程。以下是对 Promise 常用方法的详细说明。 #### 1. `Promise.resolve(value)` 该方法返回一个以给定值解析后的 `Promise` 对象。如果传入的值是一个 Promise,则返回该对象本身;否则,返回一个新的以该值为结果的 Promise。此方法在将已有值包装为 Promise 时非常有用。 ```javascript const resolvedPromise = Promise.resolve('Already resolved'); resolvedPromise.then(value => console.log(value)); // 输出: Already resolved ``` #### 2. `Promise.reject(reason)` 此方法返回一个以指定原因拒绝的 Promise,适用于需要立即触发错误处理的场景。 ```javascript const rejectedPromise = Promise.reject('Something went wrong'); rejectedPromise.catch(error => console.error(error)); // 输出: Something went wrong ``` #### 3. `Promise.all(iterable)` 该方法接收一个 Promise 可迭代对象(如数组),并返回一个新的 Promise。当所有输入的 Promise 都成功完成时,它才会以数组形式返回所有 Promise 的结果,顺序与输入顺序一致。若任意一个 Promise 被拒绝,则立即以该拒绝原因结束。 ```javascript const p1 = Promise.resolve(3); const p2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo')); const p3 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'bar')); Promise.all([p1, p2, p3]) .then(values => console.log(values)) // 输出: [3, "foo", "bar"] .catch(error => console.error('其中一个Promise被拒绝:', error)); ``` #### 4. `Promise.allSettled(iterable)` 与 `Promise.all` 类似,但不同之处在于它会等待所有 Promise 完成,无论它们是成功还是失败,并返回一个包含每个 Promise 结果的对象数组。 ```javascript Promise.allSettled([Promise.resolve(1), Promise.reject('出错了'), Promise.resolve(3)]) .then(results => console.log(results)); // 输出: [ // { status: 'fulfilled', value: 1 }, // { status: 'rejected', reason: '出错了' }, // { status: 'fulfilled', value: 3 } // ] ``` #### 5. `Promise.any(iterable)` 此方法接收一组 Promise,并在其中任意一个 Promise 成功时立即返回该结果。如果所有 Promise 都失败,则返回一个拒绝状态的 Promise,其原因为所有失败的汇总。 ```javascript Promise.any([Promise.reject('第一个失败'), Promise.resolve('第二个成功'), Promise.reject('第三个失败')]) .then(value => console.log(value)) // 输出: 第二个成功 .catch(error => console.error('所有Promise都失败:', error)); ``` #### 6. `Promise.race(iterable)` 该方法接收一组 Promise,并在其中任意一个 Promise 状态改变时立即以相同状态结束,无论其是成功还是失败。 ```javascript const p1 = new Promise((resolve, reject) => setTimeout(resolve, 500, '五百毫秒')); const p2 = new Promise((resolve, reject) => setTimeout(reject, 100, '一百毫秒')); Promise.race([p1, p2]) .then(value => console.log(value)) .catch(error => console.error(error)); // 输出: 一百毫秒 ``` #### 7. `Promise.prototype.then(onFulfilled, onRejected)` `then` 方法用于注册当 Promise 状态变为 fulfilled 或 rejected 时的回调函数。它返回一个新的 Promise,从而支持链式调用。 ```javascript fetchData() .then(data => { console.log('第一步处理数据:', data); return data + ' 经过第二步处理'; }) .then(processedData => { console.log(processedData); // 输出: 操作成功 经过第二步处理 }) .catch(error => { console.error('发生错误:', error); }); function fetchData() { return new Promise(resolve => { setTimeout(() => resolve('操作成功'), 1000); }); } ``` #### 8. `Promise.prototype.catch(onRejected)` 此方法用于捕获在 Promise 链中发生的错误。如果在 `then` 链中的任何一步抛出异常或返回一个被拒绝的 Promise,都会触发最近的 `catch` 回调。 ```javascript someAsyncFunction() .then(() => { throw new Error('出错了'); }) .catch(error => { console.error('捕获到错误:', error.message); // 输出: 出错了 }); function someAsyncFunction() { return Promise.resolve(); } ``` #### 9. `Promise.prototype.finally(onFinally)` 无论 Promise 最终状态是 fulfilled 还是 rejected,`finally` 方法都会执行指定的回调函数,通常用于清理资源。 ```javascript fetchData() .then(data => console.log('数据:', data)) .catch(error => console.error('错误:', error)) .finally(() => console.log('操作完成')); ``` ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值