理解Promise的3种姿势


对于Promise,也许你会用了,却并不理解;也许你理解了,却只可意会不可言传。这篇博客将从3个简单的视角理解Promise,应该对你有所帮助。


示例1中,asyncFunc()函数返回的是一个Promise实例:


// 示例1

function asyncFunc(){

    return new Promise(function(resolve, reject){

        setTimeout(function(){resolve('Hello');},100);

    });

}

asyncFunc().then(function(x){

    console.log(x); // 1秒之后打印"Hello"}

);


1秒之后,Promise实例的状态变为resolved,就会触发then绑定的回调函数,打印resolve值,即”Hello!”。


那么,什么是Promise呢?

  • Promise调用是阻塞的

  • Promise中保存了异步操作结果

  • Promise是一个事件


Promise调用是阻塞的


示例2可以帮助我们理解阻塞:


// 示例2

function asyncFunc(){

    return new Promise(

        function(resolve, reject){

            setTimeout(function(){resolve('Hello');}, 1000);

        }

    );

}

async function main(){

    const x = await asyncFunc(); // (A)

    console.log(x); // (B) 1秒之后打印"Hello"

}

main();


以上代码是采用Async/Await语法写的,与示例1完全等价。await的中文翻译即为”等待”,这里可以”望文生义”。因此,相比于使用Promise实现,它更加直观地展示了什么是阻塞。


  1. (A)行: 等待asyncFunc()执行,直到它返回结果,并赋值给变量x

  2. (B)行: 打印x;


事实上,使用Promise实现时,也需要等待asyncFunc()执行,之后再调用then绑定的回调函数。因此,调用Promise时,代码也是阻塞的。


Promise中保存了异步操作结果


如果某个函数返回Promise实例,则这个Promise最初相当于一个空白的容器,当函数执行结束时,其结果将会放进这个容器。示例3通过数组模拟了这个过程:


// 示例3

function asyncFunc(){

    const blank = [];

    setTimeout(function(){blank.push('Hello');}, 1000);

    return blank;

}

const blank = asyncFunc();console.log(blank); //打印"[]"

setTimeout(function(){

    const x = blank[0]; // (A)console.log(x); // 2秒之后打印"Hello"

}, 2000);


开始时,blank为空数组,1秒之后,”Hello”被添加到数组中,为了确保成功,我们需要在2秒之后从blank数组中读取结果。对于Promise,我们不需要通过数组或者其他变量来传递结果,then所绑定的回调函数可以通过参数获取函数执行的结果。


Promise是一个事件


示例4模拟了事件:


// 示例4

function asyncFunc(){

    const eventEmitter = {success: []};

    setTimeout(function(){

        for (const handler of eventEmitter.success){handler('Hello');}

    }, 1000);

    return eventEmitter;

}

asyncFunc().success.push(function(x){

    console.log(x); // 1秒之后打印"Hello"

});


调用asyncFunc()之后,sucesss数组其实是空的,将回调函数push进数组,相当于绑定了事件的回调函数。1秒之后,setTimeout定时结束,则相当于事件触发了,这时sucess数组中已经注册了回调函数,于是打印”Hello”。


当Promise成功resolve时,会触发then所绑定的回调函数,这其实就是事件。


原文: Three ways of understanding Promises

译者: Fundebug

来源: https://blog.fundebug.com


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值