Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么时候一个函数应该返回一个承诺?_Javascript_Node.js_Ecmascript 6_V8_Es6 Promise - Fatal编程技术网

Javascript 什么时候一个函数应该返回一个承诺?

Javascript 什么时候一个函数应该返回一个承诺?,javascript,node.js,ecmascript-6,v8,es6-promise,Javascript,Node.js,Ecmascript 6,V8,Es6 Promise,我现在正在研究发电机和承诺,我已经掌握了它们的工作原理。现在是时候让我自己使用这些函数了。有一些指南解释了如何制作它们以及它们的用途,但是它们很少讨论何时应该使用它们 我知道这主要取决于承诺,因为生成器只是帮助代码编写看起来是同步的(除其他外) 所以我的问题是:我应该什么时候以及什么时候不应该承诺我拥有的功能? 根据我的理解,如果cpu被函数100%利用,那么我应该不承诺,因为这没有意义 如果cpu被阻塞,并且正在等待外部操作,例如等待下载,那么我想我应该推荐该功能。当您希望按顺序执行异步操作时

我现在正在研究发电机和承诺,我已经掌握了它们的工作原理。现在是时候让我自己使用这些函数了。有一些指南解释了如何制作它们以及它们的用途,但是它们很少讨论何时应该使用它们

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

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

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


如果cpu被阻塞,并且正在等待外部操作,例如等待下载,那么我想我应该
推荐该功能。

当您希望按顺序执行异步操作时,应该使用Promises。成本高昂的操作,如写入文件/db、向另一个服务发出请求等,通常都有一个异步api,因为同步执行这些操作会阻塞单线程javascript应用程序。在这些情况下,您要么使用承诺之类的东西来获得更干净的代码,要么使用命名函数并显式地逐个调用它们作为回调,要么不使用任何东西,让自己的命运金字塔充满回调

因此,假设您希望从http请求中收到的令牌中获取用户数据,然后获取关于他的所有帖子,并从您的其他服务中获得一个特别的假期优惠,您希望在请求中加入该服务。有了承诺,你可以像

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
    });
})

更清楚地描述您应该如何以及何时使用承诺。

JavaScript的IO负担非常重。对远程资源的大量调用。对于这些类型的操作,创建承诺是完全有意义的。如果您有CPU限制的操作,可以在浏览器中使用webworkers,或者在node.js中使用子进程模块。“如果CPU被阻塞,并且正在等待外部的东西,例如等待下载,那么我想我应该推荐该函数。”---举个例子吧?所有IO都已经是异步的,所以您基本上没有选择。