美文网首页程序员
Promise是什么

Promise是什么

作者: 梦想终会实现 | 来源:发表于2018-04-05 19:18 被阅读0次

Promise 对象用于异步计算.

一个Promise表示一个现在、将来或永不可能可用的值.

按照用途来解释

1.主要用于异步计算

2.可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果

3.可以在对象之间传递和操作Promise,帮助我们处理队列.

回调有四个问题

1.嵌套层次很深,难以维护

2.无法正常使用return 和throw

3.无法正常检索堆栈信息

4.多个回调之间难以建立联系

new Promise(

    /*  执行器 executor  */

    function (resolve, reject) {

        // 一段耗时很长的异步操作

        resolve();  //数据处理完成

        reject(); //数据处理出错

    }

)

    .then(function  A() {

        //成功,下一步

    }, function B() {

        //失败,做相应处理

});

Promise详解

1.Promise是一个代理对象,它和原先要进行的操作并无关系.

2.它通过引入一个回调,避免更多的回调.

Promise有3个状态

    1. pending[待定] 初始状态

    2.fulfilled[实现] 操作成功

    3.rejected[被否决] 操作失败

Promise 状态发生改变,就会触发.then()里的响应函数处理后续步骤.

Promise 状态一经改变,不会再变.

Promise 实例一经创建,执行器立即执行.

Promise执行顺序

简单demo-1

console.log('here we go');

new Promise(resolve => {

setTimeout(() => {

resolve('hello');

},2000);

})

.then(value => {

console.log(value +' world');

});

简单demo-2

console.log('here we go');

new Promise(resolve => {

setTimeout(() => {

resolve('hello');

},2000);

})

.then( value => {

console.log(value);

return new Promise(resolve => {

setTimeout(() => {

resolve('world')

},2000);

});

})

.then( value => {

console.log( value +' world');

})

假如一个Promise已经完成了,再.then()会怎样?

console.log('start');

let promise =new Promise(resolve => {

setTimeout(() => {

console.log('the promise fulfilled');

resolve('hello, world');

},1000);

});

setTimeout(() => {

promise.then( value => {

console.log(value)

});

},3000);

.then

1.   .then()接受两个函数作为参数,分别代表fulfilled 和 rejected

2.   .then()返回一个新的Promise实例,所以它可以链式调用

3.   当前面的Promise状态改变时, .then()根据其最终状态,选          择特定的状态响应函数执行

4.   状态响应函数可以返回新的Promise,或其它值

5.   如果返回新的Promise, 那么下一级 .then()会在新Promise状        态改变之后执行

6.    如果返回其它任何值,则会立刻执行下一级 .then()

.then()里有 .then() 的情况

1. 因为.then() 返回的还是Promise实例

2. 会等里面的 .then()执行完,在执行外面的

3.对于我们来说,此时最好将其展开,会更好读

简单demo_3(没展开)

console.log('start');

new Promise( resolve => {

    console.log('Step 1');

    setTimeout(() => {

        resolve(100);

   },1000);

})

.then( value => {

    return new Promise(resolve => {

        console.log('Step 1-1');

        setTimeout(() => {

            resolve(110);

        },1000);

    })

    .then( value => {

        console.log('Step 1-2');

        return value;

    })

    .then( value => {

        console.log('Step 1-3');

        return value;

    });

})

.then(value => {

    console.log(value);

    console.log('Step 2');

})

结果

start

Step 1

Step 1-1

Step 1-2

Step 1-3

110

Step 2

简单demo_3(展开后)

console.log('start');

new Promise( resolve => {

    console.log('Step 1');

    setTimeout(() => {

        resolve(100);

    },1000);

})

.then( value => {

    return new Promise(resolve => {

        console.log('Step 1-1');

        setTimeout(() => {

            resolve(110);

        },1000);

    })

})

.then( value => {

    console.log('Step 1-2');

    return value;

})

.then( value => {

    console.log('Step 1-3');

    return value;

})

.then(value => {

    console.log(value);

    console.log('Step 2');

})

结果一样

错误处理

Promise 会自动捕获内部异常,并交给rejected响应函数处理

错误处理的两种做法:

1.reject('错误信息').then(null, message => {})

2.throw new Error('错误信息').catch( message => {})

推荐使用第二种,更加清晰好读,并且可以捕获前面的错误

注意:

强烈建议在所有队列最后都加上.catch(),以避免漏洞错误处理造成意想不到的问题

Promise.all()

批量执行

1.Promise.all([p1, p2, p3, ...])用于将多个Promise实例,包装成一个新的Promise实例

2.返回的实例就是普通 Promise

3.它接受一个数组作为参数

4.数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变。

5.当所有子Promise都完成,该Promise完成,返回值是全部值的数组

6.有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果。 

简单demo

console.log('hero we go');

Promise.all([1,2,3])

.then( all => {

console.log('1', all);

return Promise.all([function () {

console.log('ooxx');

},'xxoo',false]);

})

.then( all => {

console.log('2: ', all);

let p1 =new Promise( resolve => {

setTimeout(() => {

resolve('I\'m P1');

},1500);

});

let p2 =new Promise( resolve => {

setTimeout(() => {

resolve('I\'m P2');

},1450);

});

return Promise.all([p1,p2]);

})

.then( all => {

console.log('3: ', all);

let p1 =new Promise( resolve => {

setTimeout(() => {

resolve('I\'m P1');

},1500);

});

let p2 =new Promise( (resolve, reject) => {

setTimeout(() => {

reject('I\'m P2');

},1000);

});

let p3 =new Promise( (resolve, reject) => {

setTimeout(() => {

reject('I\'m P3');

},3000);

});

return Promise.all([p1,p2,p3]);

})

.then( all => {

console.log('all', all);

})

.catch( err => {

console.log('Catch: ', err);

});

结果:

hero we go

1 [ 1, 2, 3 ]

2:  [ [Function], 'xxoo', false ]

3:  [ 'I\'m P1', 'I\'m P2' ]

Catch:  I'm P2

Promise.all()最常见就是和.map()连用

Promise.resolve()

返回一个fulfilled的Promise实例,或原始Promise实例

1.参数为空,返回一个状态为fulfilled的Promise实例

2.参数是一个跟Promise无关的值,同上,不过fulfuilled响应函数会得到这个参数

3.参数为Promise实例,则返回该实例,不做任何修改

4.参数为thenable,立刻执行它的.then()

相关文章

  • Promise 完全解读

    目录 一. Promise 简介Promise 是什么?我们为什么需要 Promise?Promise 能解决什么...

  • Promise

    promise是什么? 上手直接console.dir(Promise)出来看看promise到底是什么 咱们di...

  • ES6 Promise、手撸一个简单 Promise 实现

    Promise 的特点是什么,优缺点有什么,什么是 Promise 链? Promise 是什么 抽象表达:Pro...

  • ES6 (一) Promise ( const,let,

    (一) Promise promise是承诺,允诺的意思。(是将来发生的事) (1) Promise是什么? 从用...

  • Promise - 04 Promise 的理解和使用

    Promise 的理解和使用 1: Promise 是什么? 抽象表达Promise 是 JS 中进行异步编程的新...

  • promise与await

    解决异步编程的方法—promise与await promise是什么? Promise,简单说就是一个容器,里面保...

  • 10.4 Promise

    10.4 Promise问题一:Promise 的特点是什么,分别有什么优缺点?什么是 Promise 链?Pro...

  • JS基础:异步编程之Promise、async-await

    目录一. Promise 1. 为什么要使用Promise 2. Promise是什么 3. 如何使用Promis...

  • promise

    promise是什么 promise是一个对象“承诺将来会执行”的对象在JavaScript中称为Promise对...

  • react 中的 promise详解

    一、promise是什么?为什么会有promise? 首先,promise是js的抽象异步处理对象实现异步编程的方...

网友评论

    本文标题:Promise是什么

    本文链接:https://www.haomeiwen.com/subject/snpbcftx.html