Google云端硬盘使用什么技术进行实时操作?
当我输入多个用户正在访问的Google云端硬盘文档时,Chrome开发者工具网络标签显示没有WebSockets.
我看到两种最常见的AJAX调用类型都有"绑定"?还是"保存?" 在URL中."保存?" 每次输入时都会发出POST请求,这对于向服务器发送更新很有意义.
当另一个用户输入时,最近的"绑定?" GET呼叫保持打开状态,通过该连接传输的数据量也会增加.周期性地,"绑定?"被关闭,新的打开,逻辑似乎是持续时间和数据大小的一些功能.
这不是长轮询,因为当服务器发送更新时,它不会完成响应.
这似乎不是服务器发送的事件,因为内容类型是"text/plain"而不是"text/stream".
Google正在做什么名称?如果是这样,我该如何尝试实现呢?
JavaScript 的源映射似乎通常不比令牌粒度更细。例如,身份映射使用令牌粒度。
我知道我看过其他例子,但不记得在哪里。
为什么我们不使用基于 AST 节点的粒度呢?也就是说,如果我们的源映射有所有位置并且只有 AST 节点的开始,那会有什么缺点?
在我的理解中,源映射用于崩溃堆栈解码和调试:永远不会有错误位置或有用的断点不在某个 AST 节点的开头,对吧?
一些进一步的澄清:
该问题与 AST 已知的情况有关。因此,“生成 AST 比生成令牌数组更昂贵”无法回答这个问题。
这个问题的实际影响是,如果我们可以在保留调试器和崩溃堆栈解码器行为的同时降低源映射的粒度,那么源映射可能会小得多。主要优点是调试器的性能:开发工具可能需要很长时间来处理大型源文件,使调试变得痛苦。
以下是使用source-map库在令牌级别添加源地图位置的示例:
for (const token of tokens) {
generator.addMapping({
source: "source.js",
original: token.location(),
generated: generated.get(token).location(),
});
}
Run Code Online (Sandbox Code Playgroud)
这是在 AST 节点级别添加位置的示例:
for (const node of nodes) {
generator.addMapping({
source: "source.js",
original: node.location(),
generated: generated.get(node).location(),
});
}
Run Code Online (Sandbox Code Playgroud)
Q1:为什么期望 AST 节点的启动次数少于令牌的启动次数?
A1:因为如果 AST 节点的起始数多于令牌的起始数,那么将会有一个以非令牌开始的 AST 节点。对于解析器的作者来说,这将是一个相当大的成就!为了具体说明,假设您有以下 JavaScript 语句:
const a = function *() { return a …Run Code Online (Sandbox Code Playgroud) 使用ES6生成器,我看到如下代码:
var trivialGenerator = function *(array) {
var i,item;
for(var i=0; i < array.length; i++){
item = array[i];
yield item;
};
};
Run Code Online (Sandbox Code Playgroud)
是否有可能写下更像下面的代码?
var trivialGenerator = function *(array) {
array.forEach(function *(item){
yield item;
});
};
Run Code Online (Sandbox Code Playgroud)
我问,因为经典for循环是令人厌恶的.
我在一些 TypeScript PR 中看到了术语“同态映射类型”。这是一个例子:https : //github.com/microsoft/TypeScript/pull/21919
在 --strictNullChecks 模式下,当同态映射类型删除 ? 来自基础类型中的属性的修饰符,它还从该属性的类型中删除 undefined
什么是同态映射类型?究竟什么是同态?是否有一个非同态映射类型的好例子
我困惑的原因是同态是两个结构之间的映射,它保留了特定的操作。这里所讨论的操作是什么?也就是说,f映射在哪里,op下面等式中的内容是什么:
f(x op y) = f(x) op f(y)
我试着去上的假设op是&,操作相交两种类型。
那么一个同态映射将是这样的:
F<T & U> = F<T> & F<U>
同态映射的一个例子(来自TS 手册)是:
type Partial<T> = { [P in keyof T]?: T[P] }
Run Code Online (Sandbox Code Playgroud)
因为Partial<T & U>始终与 相同Partial<T> & Partial<U>。
问题是我想不出任何方法来使映射类型非同态!
即使像这样愚蠢的人似乎也是同态的:
type Silly<T> = { [P in "foo"]: number}
Run Code Online (Sandbox Code Playgroud)
令我困惑的是,这Silly …
我正在尝试将应用程序国际化,并且需要测试它在其他语言环境中的行为方式.
但是,即使我在Chrome和OS X中更改了语言设置,也navigator.language始终会返回en-US.
我可以对浏览器做什么强制navigator.language返回类似的东西es-MX?
澄清
我试图通过GUI,而不是代码,以用户身份进行更改.
在萨尔萨舞中,一个特征上有一个更高级别的特征。我见过关于函数定义的 HRTB,但没有看到关于特征的 HRTB。这是什么意思?
pub trait Query: Debug + Default + Sized + for<'d> QueryDb<'d> {
...
fn query_storage<'a>(
group_storage: &'a <Self as QueryDb<'_>>::GroupStorage,
) -> &'a Arc<Self::Storage>;
}
Run Code Online (Sandbox Code Playgroud)
https://github.com/salsa-rs/salsa/blob/fc6806a/src/lib.rs#L370
比如,我应该如何阅读这个?是不是说,对于任何Query,都有一个QueryDB具有一定生命周期的对应项?
这与
pub trait Query<'d>: Debug + Default + Sized + QueryDb<'d>
Run Code Online (Sandbox Code Playgroud)
除此之外 impls 无法指定'd?
我正在使用Exceljs动态创建Excel数据
我想在内存中缓冲这个东西,然后使用Koa将它发送给用户.
writeExceljs 的方法需要一个writableStream:
workbook.xlsx.write(writableStream, options)
但Koa希望有一个可读的流:
response.body = readableStream
我知道我可以将可读流传输到可写流中,但是我该怎么做?我希望Exceljs写入可写流并让Koa从同一个流中读取.我对流API感到非常沮丧!
在其他20件事中,我试过这个:
const ReadableStream = require("memory-streams").ReadableStream
const reader = new ReadableStream()
const writer = new stream.Writable({
write: function(chunk, encoding, next) {
console.log(chunk.toString())
// reader.push(chunk, encoding)
next()
}
})
const reader = new MemoryStream(null, {readable: true})
// reader.write = reader.unshift
const writer = reader
workbook.xlsx.write(writer, {})
return reader
Run Code Online (Sandbox Code Playgroud)
但它不起作用,我得到一些奇怪的错误,关于无法写入已关闭的流.但是,即使我处理错误,我的Excel文件也无法打开.
那么如何从可写流中创建可读流?
如果我按照 rustc 的指示操作,并将绑定更改为,以下错误就会消失
where F: Fn() -> () + 'static
pub struct Struct(Box<dyn Fn() -> ()>);
pub fn example<F>(f: F)
where
F: Fn() -> ()
{
Struct(Box::new(|| ())); // ok
Struct(Box::new(f)); // error: The parameter type `F` may not live long eneough
// help: consider adding an explicit lifetime bound: `F: 'static`
}
Run Code Online (Sandbox Code Playgroud)
但是,我只是不明白“静态”在这里意味着什么。这似乎并不意味着封闭本身会永远存在。
至少,关闭似乎不会永远存在。如果我让闭包拥有一些数据,那么该数据会在某个时刻被删除,这让我怀疑闭包已被删除:
pub struct Struct(Box<dyn Fn() -> ()>);
#[derive(Debug)]
struct DropMe;
impl Drop for DropMe {
fn drop(&mut self) {
println!("dropped");
}
}
/// prints: …Run Code Online (Sandbox Code Playgroud) gulp-typescript的README说它支持渐进式编译,但没有解释在这种情况下该术语的含义.
有一个问题讨论gulp-typescript增量编译比tsc慢,但它没有解释原因,或者有什么区别.
什么是gulp-typescript在进行"增量编译"时所做的事情?
我正在查看gulp-typescript的源代码,看起来gulp-typescript根本没有进行任何增量编译.当Project被创建时,它关闭在的一个实例ProjectInfo,它有一个input构件,其是一个FileCache.FileCache几乎是从文件名到源字符串的映射.在gulp-typescript中维护的其他状态并不多Project.
为了使用TS编译器API进行实际的增量编译(在后续版本中重用编译过程的产品),我希望看到以下之一:
但我没有看到源头中的任何一个.
javascript ×3
lifetime ×2
rust ×2
typescript ×2
closures ×1
ecmascript-6 ×1
for-loop ×1
generator ×1
go ×1
long-polling ×1
navigator ×1
node.js ×1
real-time ×1
source-maps ×1
stream ×1
traits ×1
websocket ×1
yield ×1