模拟实现 Promise(小白版) (5)

测试链式调用

// 测试链式调用 new Promise(r => { console.log('0.--同步-----'); r(); }).then(v => console.log('1.-----------------')) .then(v => console.log('2.-----------------')) .then(v => console.log('3.-----------------')) .then(v => console.log('4.-----------------')) .then(v => console.log('5.-----------------')) .then(v => console.log('6.-----------------')) .then(v => console.log('7.-----------------')) 输出0.--同步----- 1.----------------- 2.----------------- 3.----------------- 4.----------------- 5.----------------- 6.----------------- 7.-----------------

测试多次调用 then 注册多个回调处理

// 测试多次调用 then 注册多个回调处理 var p = new Promise(r => r(1)); p.then(v => console.log('1-----', v), err => console.error('error', err)); p.then(v => console.log('2-----', v), err => console.error('error', err)); p.then(v => console.log('3-----', v), err => console.error('error', err)); p.then(v => console.log('4-----', v), err => console.error('error', err)); 输出1----- 1 2----- 1 3----- 1 4----- 1

测试异步场景

// 测试异步场景 new Promise(r => { r(new Promise(a => setTimeout(a, 5000)).then(v => 1)); }) .then(v => { console.log(v); return new Promise(a => setTimeout(a, 1000)).then(v => 2); }) .then(v => console.log('success', v), err => console.error('error', err)); 输出1 // 5s 后才输出 success 2 // 再2s后才输出

这个测试,可以检测出 resolve 的状态变更到底有没有根据规范,区分不同场景进行不同处理,你可以网上随便找一篇 Promise 的实现,把它的代码贴到浏览器的 console 里,然后测试一下看看,就知道有没有问题了

测试执行结果类型为 Promise 对象场景

// 测试执行结果类型为 Promise 对象场景(Promise 状态 5s 后变化) new Promise(r => { r(new Promise(a => setTimeout(a, 5000))); }).then(v => console.log('success', v), err => console.error('error', err)); 输出success undefined // 5s 后才输出 // 测试执行结果类型为 Promise 对象场景(Promise 状态不会发生变化) new Promise(r => { r(new Promise(a => 1)); }).then(v => console.log('success', v), err => console.error('error', err)); 输出// 永远都不输出

测试执行结果类型为具有 then 方法的 thenable 对象场景

// 测试执行结果类型为具有 then 方法的 thenable 对象场景(then 方法内部会调用传递的函数参数) new Promise(r => { r({ then: (a, b) => { return a(1); } }); }).then(v => console.log('success', v), err => console.error('error', err)); 输出success 1 // // 测试执行结果类型为具有 then 方法的 thenable 对象场景(then 方法内部不会调用传递的函数参数) new Promise(r => { r({ then: (a, b) => { return 1; } }); }).then(v => console.log('success', v), err => console.error('error', err)); 输出// 永远都不输出 // 测试执行结果类型为具有 then 的属性,但属性值类型非函数 new Promise(r => { r({ then: 111 }); }).then(v => console.log('success', v), err => console.error('error', err)); 输出success {then: 111}

测试执行结果的传递

// 测试当 Promise rejectd 时,reject 的状态结果会一直传递到可以处理这个失败结果的那个 then 的回调中 new Promise((r, j) => { j(1); }).then(v => console.log('success', v)) .then(v => console.log('success', v), err => console.error('error', err)) .catch(err => console.log('catch', err)); 输出error 1 // 测试传给 then 的参数是非函数类型时,执行结果和状态会一直传递 new Promise(r => { r(1); }).then(1) .then(null, err => console.error('error', err)) .then(v => console.log('success', v), err => console.error('error', err)); 输出success 1 // 测试 rejectd 失败被处理后,就不会继续传递 rejectd new Promise((r,j) => { j(1); }).then(2) .then(v => console.log('success', v), err => console.error('error', err)) .then(v => console.log('success', v), err => console.error('error', err)); 输出error 1 success undefined

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzzgw.html