-
一、错误处理
1、promise会自动捕获内部异常,并交给rejected响应函数处理。
2、promise试图在现有的语言框架中解决异步回调带来的问题。在栈的语言基层运行池相关的问题就无法处理了,我们能捕获到的是异步完成回调之后的这部分栈信息,仍然无法确定是哪里导致的错误。
3、promise执行器如果发生错误,执行器状态就会被置为rejected,fulfilled状态就不会被执行。
二、错误处理的2中做法
1、reject(‘错误信息’).then(null, message => {});
2、throw new Error(‘错误信息’).catch(message => {});
推荐使用第二种,更加清晰好读,并且可以捕获前面的错误。
new Promise(resolve => { setTimeout(() => { throw new Error('bye'); }, 1000); }) .then(value => { console.log(value + 'world'); }) .catch(error => { // 整体捕获错误的方法,可以捕获promise的错误,也可以捕获then中的错误 console.log('Error:', error.message); })
查看全部 -
Promise是什么
主要用于异步计算
可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。
可以在对象之间传递和操作Promise,帮助我们处理队列
查看全部 -
js 检查表单而生,操作DOM,异步操作能够避免窗格冻结,
从观察者角度来看:AB工作完成顺序与交付他们的时间顺序无关,故为异步。
事件的侦听与响应,回调函数,ajax代码
node.js 无阻塞和高并发,异步操作是其保障,大量操作依赖回调函数
查看全部 -
.then()
1、.then()接受两个函数作为参数,分别代表fulfilled和rejected。
2、.then()返回一个新的promise实例,所以它可以链式调用。
3、当前面的promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行。
4、状态响应函数可以返回新的promise,或其他值,或不返回值。
5、如果返回新的promise,那么下一级.then()会在新promise状态改变之后执行。
查看全部 -
一、javascript
1、javascript为检查表单而生。
2、创造它的首要目标是操作dom。
3、javascript的操作大多是异步的。
二、浏览器中的javascript
1、异步操作以事件为主。
2、回调主要出现在ajax和file api
三、node.js
1、无阻塞高并发,是Node.js的招牌。
2、异步操作是其保障。
3、大量操作依赖回调函数。
查看全部 -
回调地狱图例
查看全部 -
回调有四个问题:
嵌套层次很深,难以维护;
无法正常使用return和throw
无法正常检索堆栈信息
多个回调之间难以建立联系
查看全部 -
回调有四个问题:
嵌套层次很深,难以维护;
无法正常使用return和throw
无法正常检索堆栈信息
多个回调之间难以建立联系
查看全部 -
Promise有3个状态:
pending[待定] 初始状态
fulfilled[实现] 操作成功
rejected[被否决] 操作失败
当Promise状态发生改变,就会触发.then()里的响应函数处理后续步骤。
Promise状态一经改变,就不会再变。
查看全部 -
问1: then 中 返回Promise
问2: then 中 没有返回Promise
问3: then 中 第一个参数是Promise
问4: then 中 第一个参数是一个函数
查看全部 -
primose 流程详解图
查看全部 -
console.log('go') Promise.all([1,2,3]) .then(all => { console.log('1: ', all)//注意正确写法,console一个字符串一个数组,而不需要+号将二者连城字符串 return Promise.all([()=>{ console.log('oooo')//这里,因为三个参数都是非promise且非thenable的。all会默认执行promise.resolve将其转为promise状态,且resolved状态。而这个函数也只是数组第零项,如果不调用,里边的console也不会执行 }, '0000', false]); }) .then(all =>{ console.log('2: ', all) // 这里原先写错为console.log('2: '+all), // 最后输出的是 /* 2: ()=>{ console.log('oooo')//这里,默认执行promise.resolve时,console是否执行? },0000,false */ // 这么一个字符串了 let p1 = new Promise(resolve=>{ setTimeout(()=>{ resolve('i,am p1'); },1000) }) let p2 = new Promise(resolve=>{ setTimeout(()=>{ resolve('i,m p2') }, 2000) }) let p3 = new Promise((resolve,reject)=>{ setTimeout(()=>{ reject('i,m p3') }, 3000) }) return Promise.all([p1,p2,p3]); }) .then(all=>{ console.log('end all:' + all) }) .catch(err=>{console.log('Error: '+err)}) // 自测答案 // 立即执行 // go // 1: [1,2,3] // * return [()=>{console.log('oooo')}, '0000', false] // 2: [()=>{console.log('oooo')}, '0000', false] // 3秒后 // * return reject 'i,m p3'//(因为p1,p2,p3三个promise实例,在all中,因为p3是reject状态,all遇到后立马返回该reject状态和值) // console err i,m p3
查看全部 -
then 里不返回 promise,而是返回 false, 结果:因为 then 没有返回 promise 实例,所以后面的函数先执行了。
查看全部 -
一、promise.resolve()
1、返回一个fulfilled的promise实例,或原始promise实例。
(1)参数为空,返回一个状态为fulfilled的promise实例
(2)参数是一个跟promise无关的值,同上,不过fulfilled响应函数会得到这个参数。
(3)参数为promise实例,则返回该实例,不做任何修改。
(4)参数为thenable,立刻执行它的.then()函数
查看全部 -
一、实现队列
1、forEach()
(1)
function queue(things) { let promise = Promise.resolve(); things.forEach(thing => { promise = promise.then(() => { return new Promise(resolve => { doThing(thing, () => { resolve(); }); }); }); }); return promise; } queue(['lots', 'of', 'things', ....]);
(2)常见错误:没有把.then()产生的新的promise实例赋给then,没有生成队列。
2、reduce(),数组的一端遍历到另一端。
(1)
function queue(things) { return things.reduce((promise, things) => { return promise.then(() => { return new Promise(resolve => { doThing(thing, () => { resolve(); }); }); }); }), Promise.resolve(); } queue(['lots', 'of', 'things', ....]);
(2)常见错误:Promise实例创建之后,会立刻执行执行器代码,所以这个也无法达成队列的效果。
查看全部
举报