以最简单的方式使用fetch-API时,Chrome无法正确收集垃圾.难道我做错了什么?
for (i = 0; i < 100; i++) {
fetch('https://upload.wikimedia.org/wikipedia/commons/3/3d/LARGE_elevation.jpg')
.then(response => {
console.log('Memory-bloating')
})
}
Run Code Online (Sandbox Code Playgroud)
https://jsfiddle.net/dozrpcvj/12/
这个JSFiddle用1.4GB填充内存,直到手动垃圾收集或关闭选项卡才会释放.如果你将迭代次数增加到1000,它"下载"14GB(来自自己的磁盘)而不是垃圾收集,它开始填充磁盘上的交换文件.
我做错了什么或这是Chrome中的错误?在使用Safari进行测试时,它还会使用1.4GB的硬盘驱动器,但一旦完成就会开始进行垃圾回收.
PS.您不能使用内存分析器,因为它告诉您只使用几MB的数据,即使活动监视器或Chromes自己的任务管理器说1.4GB.
当进行 GraphQL 查询时,如果查询失败,Apollo 通过数据对象和错误对象来解决这个问题。
当发生异步错误时,我们通过一个数据对象和一个错误对象获得相同的功能。但是,这次我们UnhandledPromiseRejectionWarning也得到了一个,其中包含以下信息:DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.。
所以,我们显然需要解决这个问题,但我们希望我们的异步函数能够将错误一直传递到 Apollo。我们是否需要尝试...捕获所有函数并将错误传递到树上?来自 C# 的异常如果从未被捕获的话会一直到达顶部,这听起来是一项乏味的工作,告诉 Apollo GraphQL 一个(或多个)叶子无法从数据库检索数据。
有没有更好的方法来解决这个问题,或者有什么方法可以告诉 javascript/node 未捕获的错误应该在调用树中进一步传递,直到被捕获为止?
要闻速览:
\n\n我的问题:
\n\n我没有创建 Pok\xc3\xa9mon。我的精灵大小为 60x20 像素,但我只希望底部 20x20 像素(我的脚)作为碰撞区域。
\n\n现在,拿一棵树,其底部为 20x20 像素,无法行走:
\n\n当我从底部过来时,我希望脚上方 40 像素显示在树的前面。这意味着底部前方 20 像素,实际树木前方上方 20 像素。但是,当我站在树底部上方时,我希望我的玩家完全被树后面覆盖。
\n\n当我在没有 LibGDX 的情况下进行编程时(对于桌面,低端低端),我只是首先渲染我位置上方的所有像素,然后检查是否有任何项目位于我上方/下方,然后渲染其他所有内容。
\n\n现在,我不知道当我使用OrthogonalTileMapRenderer.
public async IAsyncEnumerable<Entity> FindByIds(List<string> ids)
{
List<List<string>> splitIdsList = ids.Split(5);
var entityList = splitIdsList.Select(x => FindByIdsQuery(x)).ToList();
foreach (var entities in entityList)
{
await foreach (var entity in entities)
{
yield return entity;
}
}
}
private async IAsyncEnumerable<Entity> FindByIdsQuery(List<string> ids)
{
var result = await Connection.QueryAsync(query, new {ids})
foreach (var entity in result)
{
yield return entity;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我向这个函数发送 25 个 ID。第一个 FindByIdsQuery 需要 5000 毫秒。其他 4 个 FindByIdsQuery 需要 100 毫秒。然后这个解决方案不会输出任何实体,直到 5000 毫秒之后。有没有任何解决方案可以在有人输出时立即开始输出实体。或者,如果您可以在 Task 中执行类似操作,则使用Task.WhenAny.
需要明确的是:5 …