HTTP/1.1指定发送的响应Transfer-Encoding: chunked可以包括可选的预告片(即通常作为标题发送的内容,但出于任何原因无法在内容之前计算,因此它们可以附加到结尾),例如:
请求:
GET /trailers.html HTTP/1.1
TE: chunked, trailers
Run Code Online (Sandbox Code Playgroud)
响应:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Trailer: My-Test-Trailer
D\r\n
All your base\r\n
B\r\n;
are belong\r\n
6\r\n
to us\r\n
0\r\n
My-Test-Trailer: something\r\n
\r\n
Run Code Online (Sandbox Code Playgroud)
此请求在TE标头中指定它期望chunked响应,并将trailers在最后一个块之后查找.
响应在指定Trailer标题拖车它将被发送的列表(在这种情况下,只有一个:My-Test-Trailer)
每个块都发送为:
D= 13),然后是aCRLFAll your base),后跟一个CRLF零大小的块(0\r\n)表示身体的末端.
然后指定预告片(My-Test-Trailer: something\r\n),然后是决赛CRLF.
现在,从我到目前为止所阅读的所有内容来看,很少(如果有的话)使用预告片.这里和其他地方关于预告片的大多数讨论通常以"但你为什么还要使用预告片?"开头.
暂且不谈为什么,出于好奇,我一直试图模拟使用预告片的HTTP请求/响应交换; 但到目前为止,我还没有能够让它工作,我不确定我生成的响应是否有问题,或者是否(正如一些人所建议的那样)没有客户端寻找尾随的标题.
我试过的客户包括:curl,wfetch,Chrome + jQuery.
在所有情况下,客户端都会接收并正确地重建分块响应(All your base are …
从jQuery 1.5开始,根据XMLHTTPRequest的W3C规范,ajax方法现在可以通过调用success()处理程序正确处理304 Not Modified响应.这允许您的应用程序将请求视为成功,即使服务器实际上没有返回任何数据(因为您已经缓存了最新数据).
对于正常(未缓存)的GET请求,使用以下args调用成功处理程序:
对于缓存的GET请求,使用以下args调用成功处理程序:
(至少,这是在IOS 4.2中返回的方式,对于通过清单文件使用应用程序缓存的Web应用程序.我认为这对于大多数平台/浏览器上的常规浏览器缓存是一致的).
您可以看到,如果请求为200 OK,则仅填充"data"参数; 其中jqXHR.responseText总是填充数据,无论该数据是来自服务器(200 OK)还是来自缓存(304 Not Modified).
鉴于此,在大多数GET请求中,您的成功处理程序将要对您获得的数据执行某些操作,而不管它来自哪里,对于您的成功代码来说,最好总是使用jqXHR.responseText,而不是做这样的事情:
if ("notmodified" === status) {
// do something with jqXHR.responseText
} else {
// do something with data
}
Run Code Online (Sandbox Code Playgroud)
或者是否有一种情况,jqXHR.responseText 不会在成功处理程序中填充,但数据arg 会?
我必须通过我的代码库并更改所有成功处理程序(以前我在jQuery 1.4.2上,它总是返回数据,甚至从缓存中返回); 所以我只是想确保我以正确的方式处理它.(不要想达到目的,然后意识到我应该以另一种方式做到这一点).
我有单元测试来测试我的"缓存控制器"功能.为了测试,我暂时用我自己的模拟版本替换原生window.applicationCache对象(因为我只想测试我的代码,而不是浏览器appCache实现),例如.
window.applicationCache = { /* my appCache mock */ };
// unit tests run here. Code under test references window.applicationCache.
Run Code Online (Sandbox Code Playgroud)不久之前(大约是Chrome 16),这种方法非常有效.然后,Mac和Windows平台上的Chrome 17都删除了修补浏览器默认window.applicationCache属性的功能(虽然奇怪的是,它适用于Chrome for Linux适用于所有版本,包括Chrome 26).当时,我为此记录了一个Chromium bug ; 但不幸的是,错误报告仍被列为"未经证实".
无论如何,我只是将我的应用程序从传统的'browser globals'(即通过脚本标签加载*.js文件;所有JS对象都是全局的)移植到AMD风格的模块,使用require.js作为模块加载器.
AMD(或CommonJS)的一个好处是依赖注入,其中您的代码获取对任何依赖对象的本地引用,而不是依赖于全局引用,例如.
require(['foo'], function(Foo) {
var bar = new Foo();
});
Run Code Online (Sandbox Code Playgroud)
...这使得对象模拟变得容易,因为您可以配置模块加载器在测试模式下为'foo'传递模拟对象.
我希望通过转移依赖注入,我可以解决我的applicationCache问题(因为传递到我的模块的'window'引用可以是全局窗口对象,也可以是模拟对象).
但是我不确定如何让require.js将'window'作为依赖项注入我的模块中?
是否有可能(可能使用shim配置?)来定义"窗口"模块; 然后可以将其传递给在全局"窗口"对象上运行的任何代码?所以我可以这样做:
require(['???'], function(window) {
// 'window' here is the real window object, or for testing it's a mock window object
window.applicationCache.update();
}); …Run Code Online (Sandbox Code Playgroud) 我正在寻找一些代码示例,无论是坚固还是砂砾,都展示了如何做git push.
我有耙任务deploy:staging和deploy:production我用来部署我的应用程序.
我正在部署到heroku,所以这些任务基本上执行以下操作:
git describe --abbrev=0)git push staging v1.00)heroku config:add APP_VERSION=v1.00)(还有一些检查,以确保我没有忘记在推之前创建一个新的标签等)
最初我使用来自Rakefile的系统调用来获取这些CLI命令; 然后我开始使用git和heroku-api宝石.
然而git gem似乎被抛弃了(过去一年没有提交); 似乎Grit和坚固耐用现在是与Git合作的标准宝石.
不幸的是,由于缺乏文档,我无法弄清楚如何使用这些库中的任何一个进行git推送.
(在以下示例中,假设我正在推送的远程/分支是origin/master,并且已在本地repo中设置为远程)
从坚固开始:
$ irb
2.0.0-p0 :001 > require 'rugged'
=> true
2.0.0-p0 :002 > repo = Rugged::Repository.new('/path/to/repo')
=> #<Rugged::Repository:0x007fe8b48821c0 @encoding=#<Encoding:UTF-8>>
2.0.0-p0 :003 > remote = Rugged::Remote.lookup(repo, 'origin')
NoMethodError: undefined method `lookup' for Rugged::Remote:Class
Run Code Online (Sandbox Code Playgroud)
现在为砂砾:
$ irb
2.0.0-p0 :001 …Run Code Online (Sandbox Code Playgroud) (我是 Svelte 的新手,所以很可能我在这里做错了什么)
更新:我添加了第二个稍微不同的 REPL,它可以更好地演示问题。试试这个: https://svelte.dev/repl/ad7a65894f8440ad9081102946472544 ?version=3.20.1
我在尝试将文本输入绑定到反应值时遇到问题。
我正在努力用文字描述这个问题,所以希望所附 REPL 中问题的简化演示会更有意义。
https://svelte.dev/repl/6c8068ed4cc048919f71d87f9d020696?version=3.20.1
该演示在一个页面上包含两个自定义<Selector>组件。
第一个组件传递两个字符串值(“one”和“two”):
<Selector valueOne="one" valueTwo="two"/>
Run Code Online (Sandbox Code Playgroud)
单击输入字段旁边的按钮将设置selectedValue为这些值之一。
这反过来会触发以下反应式声明进行更新:
$: value = selectedValue
Run Code Online (Sandbox Code Playgroud)
输入字段绑定到此反应值:
<input type="text" bind:value>
Run Code Online (Sandbox Code Playgroud)
因此,单击“一”按钮将输入文本设置为“一”,单击“二”按钮将输入字段设置为“二”。
但重要的是,您仍然可以在输入字段中输入任何内容。
第二个组件传递两个数组值:
<Selector valueOne={[1, "one"]} valueTwo={[2, "two"]}/>
Run Code Online (Sandbox Code Playgroud)
再次单击按钮设置selectedValue为其中之一。
然而,这次反应式声明取决于数组元素:
$: value = selectedValue[1]
Run Code Online (Sandbox Code Playgroud)
一切都像以前一样工作,只是现在您根本无法再在输入字段中键入内容。
所以问题是 - 为什么<input bind:value>这两者的行为不同:
$: value = aString
Run Code Online (Sandbox Code Playgroud)
与
$: value = anArray[x]
Run Code Online (Sandbox Code Playgroud)