资讯专栏INFORMATION COLUMN

promise学习(3)

阿罗 / 879人阅读

摘要:此时,由于只有一个的状态能够确定,所以执行的是唯一那个确定状态的函数,而不会执行其他的,但是并不会阻止其他的执行。在实际应用中,常用来设置超时操作,比如接口请求超时等。思考这个其实并不是矛盾,接受的是返回的的状态,与原来的没有关系。

原文地址

Promise.race
// `delay`毫秒后执行resolve
function timerPromisefy(delay) {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(delay);
        }, delay);
    });
}
// 任何一个promise变为resolve或reject 的话程序就停止运行
Promise.race([
    timerPromisefy(1),
    timerPromisefy(32),
    timerPromisefy(64),
    timerPromisefy(128)
]).then(function (value) {
    console.log(value);    // => 1
});

Promise.race 是当接受的参数数组中有一个promise对象进入fulfilled或者rejected状态的时候就停止运行。此时,由于只有一个promise的状态能够确定,所以then执行的是唯一那个确定状态的resolve函数,而不会执行其他的resolve,但是并不会阻止其他promise的执行。

关于promise.race的使用

我们知道promise.race如果参数promise数组中只要有一个promise状态改变就会执行后续的回调,那么如果参数数组中最先返回的是失败状态,那就直接走到了rejected,其实这违背了我们使用的初衷。不过参数中promise状态的改变是由开发者控制的,如果不想发生这样的情况,可以在promise定义的时候设置好错误处理,保证promise.race需要解析的一定是确定的状态。

在实际应用中,promise.race常用来设置超时操作,比如接口请求超时等。而且要注意不要给promise.race传入空数组,那么这个promise将不会被解析。

为什么使用then每次需要创建一个新的promise

如果没有创建新的promise,每次都是返回之前的promise,那么当最开始promise的状态发生改变之后,后续的promise状态其实已经固定不会再改变了。这就无法实现promise的功能,所以每次的promise对象都应该相互独立,互相不影响。

看似矛盾的问题
let promise1 = Promise.resolve()
let promise2 = promise1.then(function foo(value) {
  return Promise.reject(3)
})

执行结果:

看似矛盾,promise1明明执行了成功的回调,为什么最后promise2的状态是rejected。原因是在调用then的时候,创建了新的promise,此时与promise1已经没有关系了,返回的时候改变的是新创建的promise的状态,变为rejected。

不过看了下Promises/A+的标准,这边叙述貌似还有些需要再研究确认一下的地方。

标准中说,如果onFulfilled或者onRejected返回一个promise对象(thenable对象),那么promise2会接受x的状态。上述代码似乎执行结果与标准中的叙述有矛盾,这个问题还需要再思考下。

【思考】

这个其实并不是矛盾,promise2接受的是返回的promise的状态,与原来的没有关系。这边确实很容易混淆。

关于promise.then链式调用时参数value的传递
promise1.then(function func(value){
    console.log("1-"+value)
    return value * 2
}).then(function func(value){
    console.log("2-"+value);
}).then(function func(value){
    console.log("3-"+value)
})

执行结果

可以看到,如果不使用没有return,那么上一个then的执行结果并不会传递到下一个then当中。

【思考】

有些问题如果觉得有疑惑或者弄不太清,那就一定要想着写个demo运行看下,不能靠直觉或者思维定势去想结果,毕竟~实践是检验真理的唯一标准~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96701.html

相关文章

  • 嗨,了解一下,我的Promise学习笔记

    摘要:回调函数成功回调处理器失败回调处理器用户发送一个向百度服务器获取数据的异步请求无阻塞高并发的的诞生更加严重的依赖异步操作才能完成无阻赛高并发的特性。 Promise Promise 是什么? 词语本意: 发音:[ˈprɒmɪs] 词性:名词, 翻译:许诺,允诺。 MDN解释 Promise 对象用于一个异步操作。 一个Promise表示一个现在,将来或永不可能可用的值。 按照书写方...

    yanest 评论0 收藏0
  • promise学习(2)

    摘要:所谓的能对状态进行操作的特权方法,指的就是能对对象的状态进行等调用的方法,而通常的的话只能在通过构造函数传递的方法之内对对象的状态进行操作。一般会在构造函数中编写逻辑,什么时候执行回调,什么时候执行回调。 原文地址 1. 在then中使用reject 如果一个promise最初只定义了resolve,但是还想要使用reject怎么办? 可以在then中返回一个新的promise。这个...

    firim 评论0 收藏0
  • 重学前端学习笔记(十七)--Promise里的代码为什么比setTimeout先执行?

    摘要:版本以及之前,本身还没有异步执行代码的能力,宿主环境传递给引擎,然后按顺序执行,由宿主发起任务。采纳引擎术语,把宿主发起的任务称为宏观任务,把引擎发起的任务称为微观任务。基本用法示例的回调是一个异步的执行过程。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的...

    pinecone 评论0 收藏0
  • 重学前端学习笔记(十七)--Promise里的代码为什么比setTimeout先执行?

    摘要:版本以及之前,本身还没有异步执行代码的能力,宿主环境传递给引擎,然后按顺序执行,由宿主发起任务。采纳引擎术语,把宿主发起的任务称为宏观任务,把引擎发起的任务称为微观任务。基本用法示例的回调是一个异步的执行过程。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的...

    zorpan 评论0 收藏0
  • 重学前端学习笔记(十七)--Promise里的代码为什么比setTimeout先执行?

    摘要:版本以及之前,本身还没有异步执行代码的能力,宿主环境传递给引擎,然后按顺序执行,由宿主发起任务。采纳引擎术语,把宿主发起的任务称为宏观任务,把引擎发起的任务称为微观任务。基本用法示例的回调是一个异步的执行过程。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的...

    xiongzenghui 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<