《 Promise 》

219 阅读3分钟

Promise 的用途

promise在js中主要是解决回调地狱 什么是回调地狱呢?回调地狱就是我们异步任务中嵌套异步任务一层一层的,导致我们的代码臃肿,而promise链式调用解决这种代码问题。

promise有3种状态,pending(运行种) fulfill(成功) reject(失败)


如何创建 promise

return new Promise((resolve,reject)=>{...})
任务成功则调用 resolve(result)
任务失败则调用 reject(eror)
resolve 和 reject 会再去调用成功和失败函数

二 
使用 .then(success,fail)传入成功和失败函数

Promise.prototype.then 的使用

then() 方法返回一个 Promise (en-US)。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。

示例
const promise1 = new Promise((resolve, reject) => {
   resolve('Success!');
});
   promise1.then((value) => {
   console.log(value);
  // expected output: "Success!"
});

Promise.all 的使用

Promise.all() 方法接收一个 promise 的 iterable 类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个 Promise 实例, 那个输入的所有 promise 的 resolve 回调的结果是一个数组。这个 Promise 的 resolve 回调执行是在所有输入的 promise 的 resolve 回调都结束,或者输入的 iterable 里没有 promise 了的时候。它的 reject 回调执行是,只要任何一个输入的 promise 的reject回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。

示例
   const promise1 = Promise.resolve(3);
     const promise2 = 42;
    const promise3 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'foo');
});

     Promise.all([promise1, promise2, promise3]).then((values) => {
     console.log(values);
});
 // expected output: Array [3, 42, "foo"]
语法
Promise.all(iterable);

返回值

  • 如果传入的参数是一个空的可迭代对象,则返回一个已完成 (already resolved) 状态的 Promise
  • 如果传入的参数不包含任何 promise,则返回一个异步完成(asynchronously resolved) Promise。注意:Google Chrome 58 在这种情况下返回一个**已完成(already resolved)**状态的 Promise。
  • 其它情况下返回一个处理中(pending)的Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。 见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。

Promise.race 的使用

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

示例
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
// Both resolve, but promise2 is faster
});
// expected output: "two"

语法

Promise.race(iterable);

返回值

一个待定的 Promise 只要给定的迭代中的一个promise解决或拒绝,就采用第一个promise的值作为它的值,从而异步地解析或拒绝(一旦堆栈为空)。

描述

race 函数返回一个 Promise,它将与第一个传递的 promise 相同的完成方式被完成。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。 如果传的迭代是空的,则返回的 promise 将永远等待。 如果迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race 将解析为迭代中找到的第一个值。

Promise.race的异步性 示例

// we are passing as argument an array of promises that are already resolved,
// to trigger Promise.race as soon as possible
var resolvedPromisesArray = [Promise.resolve(33), Promise.resolve(44)];
var p = Promise.race(resolvedPromisesArray);
// immediately logging the value of p
console.log(p);
// using setTimeout we can execute code after the stack is empty
setTimeout(function(){
console.log('the stack is now empty');
console.log(p);
});
// logs, in order:
// Promise { <state>: "pending" }
// the stack is now empty
// Promise { <state>: "fulfilled", <value>: 33 }

使用 Promise.race – setTimeout 的示例

  var p1 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 500, "one");
});
 var p2 = new Promise(function(resolve, reject) {
 setTimeout(resolve, 100, "two");
});

 Promise.race([p1, p2]).then(function(value) {
  console.log(value); // "two"
 // 两个都完成,但 p2 更快
});

 var p3 = new Promise(function(resolve, reject) {
 setTimeout(resolve, 100, "three");
});
  var p4 = new Promise(function(resolve, reject) {
  setTimeout(reject, 500, "four");
});

 Promise.race([p3, p4]).then(function(value) {
 console.log(value); // "three"
// p3 更快,所以它完成了
}, function(reason) {
  // 未被调用
});

 var p5 = new Promise(function(resolve, reject) {
 setTimeout(resolve, 500, "five");
});
var p6 = new Promise(function(resolve, reject) {
setTimeout(reject, 100, "six");
});

Promise.race([p5, p6]).then(function(value) {
 // 未被调用
}, function(reason) {
 console.log(reason); // "six"
 // p6 更快,所以它失败了
});

本文借鉴了promise MDN 学习小记