理解promise的三种姿势-创新互联

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

创新互联是一家集网站建设,绛县企业网站建设,绛县品牌网站建设,网站定制,绛县网站建设报价,网络营销,网络优化,绛县网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
  • 原文: Three ways of understanding Promises
  • 译者: Fundebug

为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。

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

// 示例1
function asyncFunc()
{
    return new Promise(function(resolve, reject)
    {
        setTimeout(function()
        {
            resolve('Hello, Fundebug!');
        }, 100);
    });
}

asyncFunc()
    .then(function(x)
    {
        console.log(x); // 1秒之后打印"Hello, Fundebug!"
    });

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

那么,什么是Promise呢?

  • Promise调用是阻塞的
  • Promise中保存了异步操作结果
  • Promise是一个事件

Promise调用是阻塞的

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

// 示例2
function asyncFunc()
{
    return new Promise(function(resolve, reject)
    {
        setTimeout(function()
        {
            resolve('Hello, Fundebug!');
        }, 1000);
    });
}

async function main()
{
    const x = await asyncFunc(); // (A)
    console.log(x); // (B) 1秒之后打印"Hello, Fundebug!"
}

main();

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

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

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

Promise中保存了异步操作结果

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

// 示例3
function asyncFunc()
{
    const blank = [];
    setTimeout(function()
    {
        blank.push('Hello, Fundebug!');
    }, 1000);
    return blank;
}

const blank = asyncFunc();

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

setTimeout(function()
{
    const x = blank[0]; // (A)
    console.log(x); // 2秒之后打印"Hello, Fundebug!"
}, 2000);

开始时,blank为空数组,1秒之后,"Hello, Fundebug!"被添加到数组中,为了确保成功,我们需要在2秒之后从blank数组中读取结果。

对于Promise,我们不需要通过数组或者其他变量来传递结果,then所绑定的回调函数可以通过参数获取函数执行的结果。

Promise是一个事件

示例4模拟了事件:

// 示例4
function asyncFunc()
{
    const eventEmitter = {
        success: []
    };

    setTimeout(function()
    {
        for (const handler of eventEmitter.success)
        {
            handler('Hello, Fundebug!');
        }
    }, 1000);

    return eventEmitter;
}

asyncFunc()
    .success.push(function(x)
    {
        console.log(x); // 1秒之后打印"Hello, Fundebug!"
    });

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

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

参考

  • Promises for asynchronous programming
  • Async functions
  • ECMAScript 6 入门 - Promise对象

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了9亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!

理解promise的三种姿势

版权声明

转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/09/25/3-ways-to-understand-promise/

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站标题:理解promise的三种姿势-创新互联
文章位置:http://ybzwz.com/article/dcpigh.html