gpt4 book ai didi

javascript - 由于异步生成器中的非并行等待 promise 而减速

转载 作者:行者123 更新时间:2023-12-03 13:24:30 24 4
gpt4 key购买 nike

我正在使用生成器和 Bluebird 编写代码,我有以下内容:

var async = Promise.coroutine;
function Client(request){
this.request = request;
}


Client.prototype.fetchCommentData = async(function* (user){
var country = yield countryService.countryFor(user.ip);
var data = yield api.getCommentDataFor(user.id);
var notBanned = yield authServer.authenticate(user.id);
if (!notBanned) throw new AuthenticationError(user.id);
return {
country: country,
comments: data,
notBanned: true
};
});

但是,这有点慢,我觉得我的应用程序等待 I/O 的时间太多,而且它不是并行的。如何提高应用程序的性能?
countryFor 的总响应时间为 800 + 400 为 getCommentDataFor + 600 为 authenticate所以总共1800毫秒,这是很多。

最佳答案

您花费了太多时间等待来自不同来源的 I/O。

在普通的 promise 代码中,你会使用 Promise.all然而,为此 - 人们倾向于编写代码来等待生成器的请求。您的代码执行以下操作:

<-client     service->
countryFor..
''--..
''--..
''--.. country server sends response
..--''
..--''
..--''
getCommentDataFor
''--..
''--..
''--..
''--.. comment service returns response
..--''
..--''
..--''
authenticate
''--..
''--..
''--.. authentication service returns
..--''
..--''
..--''
Generator done.

相反,它应该这样做:
<-client     service->
countryFor..
commentsFor..''--..
authenticate..''--..''--..
''--..''--..''--.. country server sends response
''--..--''.. comment service returns response
..--''..--''.. authentication service returns response
..--''..--''..
..--''..--''..--''
..--''..--''
..--''
Generator done

简单地说,你所有的 I/O 都应该在这里并行完成。

为了解决这个问题,我会使用 Promise.props . Promise.props接受一个对象并等待其所有属性解析(如果它们是 promise )。

请记住 - 生成器和 promise 非常好地混合和匹配,您只需生成 promise :
Client.prototype.fetchCommentData = async(function* (user){
var country = countryService.countryFor(user.ip);
var data = api.getCommentDataFor(user.id);
var notBanned = authServer.authenticate(user.id).then(function(val){
if(!val) throw new AuthenticationError(user.id);
});
return Promise.props({ // wait for all promises to resolve
country : country,
comments : data,
notBanned: notBanned
});
});

这是人们第一次使用生成器时常犯的错误。

无耻地从 Kris Kowal 的 Q-Connection 中获取的 ascii 艺术

关于javascript - 由于异步生成器中的非并行等待 promise 而减速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com