Promise

Promise

Promise的用途

如果异步任务有成功和失败两个结果时,如果想不阻塞程序运行,传统方法有两种:

① 回调接受两个参数:

1
2
3
4
fs.readFile('./1.txt',(error,data)=>{
if(error){console.log('失败');return;}
console.log(data.toString());
});

② 使用两个回调分别表示成功和失败

1
2
3
4
5
6
7
8
// 第一个函数时成功回调,第二个函数时失败回调
ajax('get','./1.json',(data)=>{},(error)=>{});

// 或者接受一个对象,这个对象有两个key分别表示成功和失败
ajax('get','./1.json',{
success:()=>{},
fail:()=>{}
});

传统方法存在以下不足:

Ⅰ. 代码不规范

Ⅱ. 容易出现回调地狱

Ⅲ. 很难进行错误处理

为了解决这些问题,前端程序员提出了Promise思想,制定了Promise/A+规范。

创建Promise

1
return new Promise((resolve,reject)=>{});

任务成功则调用resolve(result)

任务失败则调用reject(error)

resolve和reject再通过then方法

Promise.prototype.then

1
2
3
4
5
6
7
p.then(onFulfilled[, onRejected]);

p.then(value => {
// fulfillment
}, reason => {
// rejection
});

then的第一个参数就是success

then的第二个参数就是fail

举例:

1
2
3
4
5
6
7
8
9
10
11
var p1 = new Promise((resolve, reject) => {
resolve('Success!');
// or
// reject(new Error("fucking fucked!"));
});

p1.then(value => {
console.log(value); // Success!
}, reason => {
console.error(reason); // Error: fucking fucked!
});

Promise.all

Promise.all() 方法接收一个promise的iterable类型(Array,Map,Set)的输入,并且只返回一个Promise实例, 那个输入的所有promise的resolve回调的结果是一个数组。

语法:

1
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就会解决或拒绝。

语法:

1
Promise.race(iterable);

参数

返回值

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

描述

race 函数返回一个 Promise,它将与第一个传递的 promise 相同的完成方式被完成。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。

如果传的迭代是空的,则返回的 promise 将永远等待。

如果迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race 将解析为迭代中找到的第一个值。


版权声明:本文作者为「Andy8421」.本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!