在Jest中有没有办法模拟全局对象,比如navigator
,Image
*?我已经非常放弃了这一点,并将其留给了一系列可模拟的实用方法.例如:
// Utils.js
export isOnline() {
return navigator.onLine;
}
Run Code Online (Sandbox Code Playgroud)
测试这个微小的功能很简单,但很苛刻,而且根本不具有确定性.我可以获得75%的方式,但这是我可以做的:
// Utils.test.js
it('knows if it is online', () => {
const { isOnline } = require('path/to/Utils');
expect(() => isOnline()).not.toThrow();
expect(typeof isOnline()).toBe('boolean');
});
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我对这个间接是好的,我现在可以navigator
通过这些实用程序访问:
// Foo.js
import { isOnline } from './Utils';
export default class Foo {
doSomethingOnline() {
if (!isOnline()) throw new Error('Not online');
/* More implementation */
}
}
Run Code Online (Sandbox Code Playgroud)
......并确定性地测试这样......
// Foo.test.js
it('throws when offline', () => {
const Utils = require('../services/Utils');
Utils.isOnline …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为数据结构创建一个简单的基于网格的编辑器,我对React.js有一些概念上的问题.他们的文档对此没有多大帮助,所以我希望有人可以提供帮助.
首先,将状态从外部组件转移到内部组件的正确方法是什么?是否有可能将内部组件中的状态更改"冒泡"到外部组件?
其次,两个独立的组件可以共享数据,从而一个中的突变在另一个中可见吗?
下面是我想要做的事情的简化示例(JSFiddle版本):
我有一个company
包含employee
对象数组的对象.我想employee
在可编辑的网格中列出列表.当我单击按钮时,我想查看生成的company
对象以及任何突变(写入控制台).
/** @jsx React.DOM */
var Cell = React.createClass({
getInitialState: function () {
return {data: ""};
},
componentWillMount: function () {
this.setState({data: this.props.data});
},
onChange: function (evt) {
console.log(this.state, evt.target.value);
this.setState({data: evt.target.value});
},
render: function () {
var data = this.props.data;
return <input value={this.state.data} onChange={this.onChange} />
}
});
var Row = React.createClass({
render: function () {
return (<div className="row">
<Cell data={this.props.data.name} />
<Cell data={this.props.data.location} />
<Cell …
Run Code Online (Sandbox Code Playgroud) 是否可以有一个跨越整个表行的背景渐变?我只能将背景应用于单个表格单元格,即使我专门试图阻止它.这是一个针对jsfiddle上的Webkit的简化示例:
正如你所看到的,我使用border-collapse:collapse
,我指定background:transparent
了<tr>
和<th>
子元素,但重复每个单元格的红色渐变到左边.我已经尝试将背景应用于<tr>
同样的,但结果与您现在看到的结果相同.
要查看代码而不使用jsfiddle,这里是:
HTML
<table>
<thead>
<tr>
<th>One</th>
<th>Two</th>
<th>Three</th>
<th>Four</th>
</tr>
</thead>
<tbody>
<tr>
<td>un</td>
<td>deux</td>
<td>trois</td>
<td>quatre</td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
CSS
* {margin:0;padding:0;border:0;border-collapse:collapse;}
table { width:100%; }
thead { background: -webkit-linear-gradient(left, rgba(222,22,22,1) 0%, rgba(222,222,222,0) 20%, rgba(222,222,222,0) 80%, rgba(222,222,222,1) 100%); }
thead tr, thead th { background:transparent; }
Run Code Online (Sandbox Code Playgroud) 如何唯一标识已安装应用程序的用户,以便:
举个例子,我看到Netflix应用会在没有任何用户互动的情况下自动链接到您的桌面帐户.我猜他们使用accountManager.getAccounts()
或类似的方法,因为他们也需要GET_ACCOUNTS
许可.但当然,该许可被标记为Protection level: dangerous
.是否有任何技术可以做到这种侵入性较小或可能令人担忧的技术?
回答这个问题的关键是既简单(对用户而言)和微创.Android提供了大量识别用户的方法,其中许多方法涉及刺破用户的隐私,如果这是唯一的方法,我会做我现在做的事情(可选的电子邮件注册).我只想让我的应用程序知道用户是否已经在我的系统中在整个安装过程中注册,而无需访问用户(用户名/密码,电子邮件地址,第三方OAuth等).
我的主要原因是:
编辑:正如下面kennytm和调查自己后指出,根据ECMA规范,当两个物体被确定为在自定义排序相同,JavaScript是不是必须离开以相同的顺序这两个对象.Chrome和Opera是唯一两种选择不稳定排序的主要浏览器,但其他浏览器包括Netscape 8&9,Kazehakaze,IceApe和其他一些浏览器.Chromium团队已将此错误标记为"按预期工作",因此不会"修复".如果您需要数组在值相等时保持其原始顺序,则需要使用一些其他机制(例如上面的那个).0
排序对象时返回实际上是没有意义的,所以不要打扰.
我刚刚得到一份报告,我写的一些代码在Chrome上打破了.我已经将它跟踪到我用于对对象数组进行排序的自定义方法.我真的很想把它称为一个错误,但我不确定是不是.
在对所有其他浏览器排序对象数组时,如果两个对象解析为相同的值,则更新后的数组中的顺序保持不变.在Chrome中,他们的订单似乎是随机的.在Chrome和您想要的任何其他浏览器中运行以下代码.你应该明白我的意思.
我有两个问题:
首先,我是否正确地假设当您的自定义分拣机返回时0
,两个比较的项目应保持其原始顺序(我有一种感觉我错了).
第二,有什么好方法可以解决这个问题吗?我唯一能想到的是在排序之前将自动递增数字作为属性添加到数组的每个成员,然后在两个项目sort
将resolve与同一值进行比较时使用该值.换句话说,永远不会返回0.
这是示例代码:
var x = [
{'a':2,'b':1},
{'a':1,'b':2},
{'a':1,'b':3},
{'a':1,'b':4},
{'a':1,'b':5},
{'a':1,'b':6},
{'a':0,'b':7},
]
var customSort = function(a,b) {
if (a.a === b.a) return 0;
if (a.a > b.a) return 1;
return -1;
};
console.log("before sorting");
for (var i = 0; i < x.length; i++) {
console.log(x[i].b);
}
x.sort(customSort);
console.log("after sorting");
for (var i = 0; i < x.length; i++) {
console.log(x[i].b); …
Run Code Online (Sandbox Code Playgroud) 我知道Node是非阻塞的,但我只是意识到默认行为http.listen(8000)
意味着所有HTTP请求都是一次一个地处理.我知道我不应该对此感到惊讶(这是端口如何工作),但它确实让我真的想知道如何编写我的代码以便我可以处理多个并行HTTP请求.
那么编写服务器的最佳方法是什么,以便它不会占用端口80并且长时间运行的响应不会导致长请求队列?
要说明问题,请尝试运行下面的代码并同时将其加载到两个浏览器选项卡中.
var http = require('http');
http.createServer(function (req, res) {
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.write("<p>" + new Date().toString() + ": starting response");
setTimeout(function () {
res.write("<p>" + new Date().toString() + ": completing response and closing connection</p>");
res.end();
}, 4000);
}).listen(8080);
Run Code Online (Sandbox Code Playgroud) Set-Cookie
在使用Fetch API时(实际上,通过fetch polyfill),我无法让Safari成功应用服务器响应.相同的代码在FF和Chrome中正常工作(我使用native和polyfill进行了测试fetch
).
credentials: true
;Set-Cookie
标题响应;有人知道问题可能是什么吗?
我已经阅读了文档,并浏览了许多已关闭的错误报告.除非我遗漏了一些东西,否则我认为问题可能是"默认浏览器行为"处理cookie和CORS - 而不是fetch(通过polyfill源代码阅读,它似乎100%无知cookie).一些错误报告表明,格式错误的服务器响应可能会阻止cookie被保存.
我的代码看起来像这样:
function buildFetch(url, init={}) {
let headers = Object.assign({}, init.headers || {}, {'Content-Type': 'application/json'});
let params = Object.assign({}, init, { credentials: 'include', headers });
return fetch(`${baseUrl}${url}`, params);
}
buildFetch('/remote/connect', {method: 'PUT', body: JSON.stringify({ code })})
.then(response => response.json())
.then(/* complete authentication */)
Run Code Online (Sandbox Code Playgroud)
实际的授权请求如下.我正在使用cURL来获取确切的请求/响应数据,因为Safari很难复制/粘贴它.
curl 'https://mydevserver:8443/api/v1/remote/connect' \
-v \
-XPUT \
-H 'Content-Type: application/json' …
Run Code Online (Sandbox Code Playgroud) 我无法在Vagrant linux机器上启动新的Meteor应用程序(在Mac上运行).每次在Mongo中出现"未指定的未捕获异常"时它都会失败.我已经尝试了很多东西来实现这一目标,但即使使用最简单的设置,我也无法让项目运行.我会很感激任何建议.
我的步骤是:
curl https://install.meteor.com/ | sh
);meteor create app
);cd app; meteor
)我知道vagrant共享文件夹的权限很古怪,所以对于上面的第3步,我尝试了放置项目:
/vagrant
,/home/vagrant
)的子目录中,/
(权限设置为vagrant:vagrant
)的子目录中,和/
权限设置为的子目录中,root:root
使用sudo meteor create app
和运行创建的项目sudo meteor
在所有情况下,我都看到了这个错误:
=> Started proxy.
Unexpected mongo exit code 100. Restarting.
Unexpected mongo exit code 100. Restarting.
Unexpected mongo exit code 100. Restarting.
Can't start Mongo server.
MongoDB had an unspecified uncaught exception.
This can be …
Run Code Online (Sandbox Code Playgroud) 我对这个问题感到非常难过.
我有一个大型的H.264 mp4视频文件库,我需要在iOS上播放.最初,我只针对iPad,但要求已经改变,现在我需要包括iPhone.但我注意到我的iPod Touch与我的iPad具有完全相同的操作系统版本和内置ID,将无法播放我在iPad上成功使用的相同文件.我已经与一位同事拥有相同版本和版本的iPhone和iPad确认了这一点.我在iPad模拟器中也看到过完全相同的行为,但直到现在我才认为它是模拟器的怪癖.现在我不太确定.
mp4使用以下设置进行编码:
AVC Coding 640x360, Millions
AAC, Stereo (L R), 44.100 kHz
29.97 fps
693.35kb/s
Run Code Online (Sandbox Code Playgroud)
我已经尝试从多个服务器甚至本地加载媒体,它似乎没有什么区别.
如果我将这些文件从QuickTime导出为m4v文件,它们可以在所有设备和模拟器上正常运行,所以我的直觉告诉我这是一个我缺少的编码器设置.
为了消除所有其他可能的因素,我尝试直接从Mobile Safari地址栏调用视频文件.我已经确认在以下匹配版本中发生了这种情况:
设备:
模拟器:
我已经浏览了iOS更新日志,寻找任何可能解释为什么视频解压缩器应该在一个版本而不是另一个版本上工作的东西,我找不到任何跳出来的东西.
任何人都有任何想法可以支持这个以及如何解决它?