【问题标题】:When shall one make a function return a promise? [duplicate]什么时候让函数返回一个承诺? [复制]
【发布时间】:2015-12-27 13:53:08
【问题描述】:

我现在正在研究生成器和承诺,并且我已经掌握了它们的工作原理。现在是时候制作我自己的函数来利用这些了。那里有指南解释如何制作它们以及它们的用途,但是他们很少讨论应该使用它们的适当时间。

我知道这主要与承诺有关,因为生成器只是帮助代码编写看起来是同步的(除其他外)。

所以我的问题是:我应该什么时候以及什么时候不应该承诺我拥有的功能?

根据我的理解,如果 cpu 被函数 100% 使用,那么我应该承诺,因为没有意义。

如果 CPU 被阻塞并且正在等待外部的东西,例如等待下载东西,那么我想我 应该 承诺该功能。

【问题讨论】:

  • JavaScript 的 IO 很重。大量调用远程资源。对于这些类型的操作,创建一个 Promise 是完全有意义的。如果你有 CPU 绑定操作,你可以看看在浏览器中使用 webworkers 或 node.js 中的 child_process 模块。
  • “如果 cpu 被阻塞并且正在等待外部的东西,比如等待下载东西,那么我想我应该承诺这个功能。” --- 有什么例子呢?所有的 IO 都已经是异步的了,所以你基本上别无选择。

标签: javascript node.js ecmascript-6 v8 es6-promise


【解决方案1】:

当您有要按顺序执行的异步操作时,应使用 Promise。成本高昂的操作,例如写入文件/数据库、向另一个服务发出请求等,通常具有异步 API,因为同步执行这些操作会阻塞您的单线程 JavaScript 应用程序。在这些情况下,您要么使用类似 Promise 的东西来获得更简洁的代码,要么使用命名函数并显式地一个接一个地调用它们作为回调,要么不使用任何东西,让自己拥有一个充满回调的厄运金字塔。

因此,假设您想从您在 http 请求中收到的令牌中获取用户数据,然后获取有关他的所有帖子,并从您想要坚持使用的其他服务之一获得特别假期优惠请求。有了 Promise,你可以做类似

router.get('/activities', function(req, res){           
    userRepo.findByToken(token).then(checkForOffer).then(activityRepo.getUserPosts).then(function(composite){
        res.send({activities: composite.activities, offer: composite.offer});
    }).fail(function(err){
        //handle the error
    });
})

This post 更清楚地了解应该如何以及何时使用 Promise。

【讨论】:

    猜你喜欢
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    相关资源
    最近更新 更多