做为一个容器,用于存储将来要发生的事情,其状态分别为pending
,resolved
,rejected
。 javascript
缺点:基本在于若是他执行了,那么没法中途取消,若是没有设置回调,则没有返回结果,也没有错误说明。
理解:
1. 一个异步须要很长时间执行时,对于promise
函数执行的方法是没有办法终止的。
2. 须要设置回调,没法获得返回或错误。(没有回调写个毛线啊!!)java
var promise = new Promise( function(resolve,reject){ if(/*执行成功*/){ resolve(value); }else{ reject(value); } } );
说明:
1. 在异步执行完成后,经过resolve(value)
或者reject(value)
能够将在异步中获取到值value
传递出去。交给promise.then()方法进行调用。
2. 同时then()
方法中return new_value
处理后的值实现值的再传递。shell
那么,在then 方法中又出现异步的时候,是怎么样的状况呢?针对的是内外都是
promise
函数promise
var p1 = new Promise((resolve,reject)=>{ setTimeout()=>{ reject(new Error('fail')),3000) } }); var p2 = new Promise(function (resolve, reject) { setTimeout(() => resolve(p1), 1000) }) p2.then(result => console.log(result)) .catch(error => console.log(error)) // Error: fail
说明:
1. p2执行调用了p1,这个时候,p1的状态交给了p2。
2. 只有在p1的执行完成后,也就是被resolve或者reject以后,才会执行p2的回调。异步
说明:async
- then():then()完整的方式是2个参数,分别为resolve的后来执行,以及reject的后面执行。
- all():参数是一组promise,当都完成后,才会执行回调。
- catch():将then()函数的方法单独出来做为一个请求。用于全局的异常错误处理。经过reject(err)的做用等同于抛出
错误
。- race():竞争上岗。
Promise.resolve()
: 等同new Promise(resolve=>resolve(foo))
,thenable
也就是一个返回有一个then
属性的对象- 若是resolve()函数的方法没有参数,也就是在异步以后执行。也就是在本次执行完成时候。
setTimeout(function () { console.log('three'); }, 0); Promise.resolve().then(function () { console.log('two'); }); console.log('one'); // one // two // three
- done():用于处理异常,捕捉错误,向着全局抛出。就是是done以后的异常是会被执行器捕获到。
- finally():最后都会执行的方法。
我的的看法:
相似一个stack,因为存放各种的处理的语言,能够是异步,也多是同步,在执行next()的方法的时候,跳转到下一个语句。函数
function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); //执行 hw.next() // { value: 'hello', done: false } hw.next() // { value: 'world', done: false } hw.next() // { value: 'ending', done: true } hw.next() // { value: undefined, done: true }
说明:如何使用generator()函数
1. thunk思想
2. co小工具工具
var gen = function* () { var f1 = yield readFile('/etc/fstab'); var f2 = yield readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); }; var co = require('co'); co(gen); co(gen).then(function (){ console.log('Generator 函数执行完成'); });
注意:yeild
后面接的是promise()的对象。ui
是对generator函数的升级改造
javascript
code
var asyncReadFile = async function () {
var f1 = await readFile('/etc/fstab');
var f2 = await readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};
`` 包裹的字符串,同时${}来包裹变量