javascript基础系列之Promise原理及模拟实现(续)

229 阅读1分钟

Promise的局限性(你不知道的JavaScript)

  1. 顺序错误处理,利用异常值传透,可以在最后补货错误。很多时候没有为Promise链序列的中间步骤保留的引用,因此没有这样的引用,无法错误关联错误处理函数来可靠地确定错误。
  2. 单一值:promise只能有一个完成值或者一个拒绝的理由,在复杂的场景中,这是一种局限。 解决方法:1)分裂值:将两个异步结果包装成数组,再利用Promise.all方法
  3. 单决议:应用场景:获取button点击事件产生的数据,由于单决议的特点(resolve/reject函数只运行一次),要想利用Promise控制数据流只能让每次点击的时候重新生成一个promise
//按钮只会在第一次的时候获取数据
cosnt p = new Promise((resolve, reject)=>{
    //click函数把resolve绑定在dom元素上
    //evt隐式传参
    click("#btn", resolve)
})
//在按钮没有被点击之前 p一直是pending状态
p.then(evt => {
    cont btnID = evt.currentTarget.id
    return request("http://sample.url1/?id=" + btnID)
}).then(res => console.log(res))

//改良,但是破坏力SoC思想
click("#btn", evt => {
    const btnID = evt.currentTarget.id
    request("http://sample.url1/?id=" + btnID)
    .then(res => console.log(res))
})
  1. 无法取消:如果一个任务悬而未决,那么无法从外部停止它的进程。如果可以从外部取消,那么违背了未来值的可信任性。
  2. 性能:将一切变为了一部,但是它的优点是否足以弥补它的这个缺点?