我对nextTick和setImmediate之间的差异感到非常困惑.我已经在互联网上阅读了有关它们的所有文档,但我仍然不明白它们是如何工作的.
例子:
function log(n) { console.log(n); }
Run Code Online (Sandbox Code Playgroud)
setImmediate
setImmediate(function() {
setImmediate(function() {
log(1);
setImmediate(function() { log(2); });
setImmediate(function() { log(3); });
});
setImmediate(function() {
log(4);
setImmediate(function() { log(5); });
setImmediate(function() { log(6); });
});
});
//1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
nextTick
process.nextTick(function() {
process.nextTick(function() {
log(1);
process.nextTick(function() { log(2); });
process.nextTick(function() { log(3); });
});
process.nextTick(function() {
log(4);
process.nextTick(function() { log(5); });
process.nextTick(function() { log(6); });
});
});
//1 4 2 3 5 6
Run Code Online (Sandbox Code Playgroud)
为什么这些结果?请用视觉或非常容易理解的方式解释.甚至节点核心开发人员也不同意人们应该如何理解nextTick和setImmediate.
资料来源:
我一直在寻找如何用其他语言来做,我发现我必须使用特殊字符\ b来删除最后一个字符.(how-do-do-do-erase-printed-characters-in-a-console-applicationlinux)
这对于对console.log()的多次调用中的node.js不起作用;
如果我写一个日志:
console.log ("abc\bd");
Run Code Online (Sandbox Code Playgroud)
我得到了结果:abd
但如果我写:
console.log ("abc");
console.log ("\bd");
Run Code Online (Sandbox Code Playgroud)
我得到了结果:
abc
d
我的目标是打印一条等待的消息:
等待
等待.
等待......
等待......
然后再次:
等待
等待.
等等
都在同一条线上.
我有一个带有一些二进制数据的缓冲区:
var b = new Buffer ([0x00, 0x01, 0x02]);
Run Code Online (Sandbox Code Playgroud)
而且我想补充一下0x03.
如何附加更多二进制数据?我在文档中搜索但是为了追加数据它必须是一个字符串,如果没有,就会发生错误(TypeError:Argument必须是一个字符串):
var b = new Buffer (256);
b.write ("hola");
console.log (b.toString ("utf8", 0, 4)); //hola
b.write (", adios", 4);
console.log (b.toString ("utf8", 0, 11)); //hola, adios
Run Code Online (Sandbox Code Playgroud)
然后,我在这里看到的唯一解决方案是为每个附加的二进制数据创建一个新的缓冲区,并将其复制到具有正确偏移量的主缓冲区:
var b = new Buffer (4); //4 for having a nice printed buffer, but the size will be 16KB
new Buffer ([0x00, 0x01, 0x02]).copy (b);
console.log (b); //<Buffer 00 01 02 00>
new Buffer ([0x03]).copy (b, 3);
console.log (b); …Run Code Online (Sandbox Code Playgroud) 我想在发送json对象时从bodyParser()中间件中捕获错误,但它无效,因为我想发送自定义响应而不是通用400错误.
这是我拥有的,它的工作原理:
app.use (express.bodyParser ());
app.use (function (error, req, res, next){
//Catch bodyParser error
if (error.message === "invalid json"){
sendError (res, myCustomErrorMessage);
}else{
next ();
}
});
Run Code Online (Sandbox Code Playgroud)
但在我看来这是一个非常难看的方法,因为我正在比较可能在未来的快速版本中更改的错误消息.有没有其他方法来捕获bodyParser()错误?
编辑:
当请求正文具有无效的json时,这是错误:
{
stack: 'Error: invalid json\n at Object.exports.error (<path>/node_modules/express/node_modules/connect/lib/utils.js:55:13)\n at IncomingMessage.<anonymous> (<path>/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71)\n at IncomingMessage.EventEmitter.emit (events.js:92:17)\n at _stream_readable.js:872:14\n at process._tickDomainCallback (node.js:459:13)',
arguments: undefined,
type: undefined,
message: 'invalid json',
status: 400
}
Run Code Online (Sandbox Code Playgroud)
漂亮的印刷堆栈:
Error: invalid json
at Object.exports.error (<path>/node_modules/express/node_modules/connect/lib/utils.js:55:13)
at IncomingMessage.<anonymous> (<path>/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71)
at IncomingMessage.EventEmitter.emit (events.js:92:17)
at _stream_readable.js:872:14
at process._tickDomainCallback (node.js:459:13)
Run Code Online (Sandbox Code Playgroud) 我有一个与servlet映射有关的问题.我在web.xml中有以下内容:
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>test.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
如果我访问http://localhost:<port>/MyApp/HelloWorldservlet HelloWorldServlet被调用.
我也想让我的小礼服回应http://localhost:<port>/MyApp/HelloWorld/.我怎样才能达到这个效果?我正在使用NetBeans进行开发,但它不允许我将模式结束/.
这是一个非常基本的问题.在Java中,我使用finally语句来关闭资源,因为"这是一个很好的做法".我在Javascript中开发,然后在Node.js中开发了几年,我从未使用过该finally语句.我知道在Node.js中我们所有人都遵循第一个参数错误处理模式.无论如何,以下2个片段也是如此:
try{
throw 123
}catch (e){
}finally{
console.log(1)
}
Run Code Online (Sandbox Code Playgroud)
.
try{
throw 123
}catch (e){
}
console.log(1)
Run Code Online (Sandbox Code Playgroud)
两者都打印1.
为什么finally它有没有真正的好处关键字?清理代码可以放在catch中.
我正在使用node-webkit,我正在尝试让用户选择一个文件夹,然后我将返回该文件夹的目录结构并递归获取其子文件.
我用这个代码(在Angular Controller中)可以很简单地工作.
var fs = require('fs');
$scope.explorer=[];
$scope.openFile = function(){
$scope.explorer = [tree_entry($scope.path)];
get_folder($scope.path, $scope.explorer[0].children);
};
function get_folder(path, tree){
fs.readdir(path, function(err,files){
if (err) return console.log(err);
files.forEach( function (file,idx){
tree.push(tree_entry(file));
fs.lstat(path+'/'+file,function(err,stats){
if(err) return console.log(err);
if(stats.isDirectory()){
get_folder(path+'/'+file,tree[idx].children);
}
});
});
});
console.log($scope.explorer);
return;
}
function tree_entry(entry){
return { label : entry, children: []}
}
使用具有22个子文件夹和大约4个级别的中等大小的文件夹,需要几分钟才能获得整个目录结构.
有什么东西我在这里显然做错了吗?我不敢相信这需要很长时间,因为我正在使用内置的Node fs方法.或者有没有办法获取目录的全部内容而不触及每个文件?
我希望能够在树的所有方向上对文件名使用Angular过滤器,也可能在内容上使用Angular过滤器,因此延迟处理整个树并不是一个可行的解决方案.
回到过去,我学到了很多关于CSS的知识,但现在我不记得如何重用样式了.
例:
我有一些关于类的选项卡,tab我可以用javascript切换它们.当前选定的选项卡有另一个类active.
他们的CSS风格:
.tab {
position: relative;
top: 0;
left: 0;
width: 100%;
padding: 15px 0 15px 0;
border: solid thin #CCC;
text-align: center;
font-weight: bold;
margin-bottom: 10px;
color: #272F42;
cursor: pointer;
background-color: white;
}
.active {
position: relative;
top: 0;
left: 0;
padding: 15px 0 15px 0;
border: solid thin #CCC;
text-align: center;
font-weight: bold;
margin-bottom: 10px;
color: #272F42;
cursor: default;
background-color: #FFCF75;
}
Run Code Online (Sandbox Code Playgroud)
这两种风格都有很多相同的风格,除了2 cursor和background-color.
所以我的问题是,如何重新使用.tab样式并在.active中使用它?
我希望实现这样的目标:
.active { //extends …Run Code Online (Sandbox Code Playgroud) 有两种方法可以获得3个旋转值(方位角,俯仰,滚动).
一个是注册TYPE_ORIENTATION类型的监听器.这是最简单的方法,我从每次旋转中得到正确的值范围,如文档所示:azimuth:[0,359] pitch:[ - 180,180] roll:[ - 90,90]
另一个,你第一次看到它时最精确和最复杂.Android推荐它,所以我想使用它,但我得到不同的值.
方位角:[ - 180,180].-180/180是S,0 i N,90 E和-90 W.
pitch:[ - 90,90 ].90为90,-90为-90,0为0但-180/180(屏幕向下)为0.
roll:[ - 180,180].
我应该得到相同的值,但有小数,对吧?
我有以下代码:
aValues = new float[3];
mValues = new float[3];
sensorListener = new SensorEventListener (){
public void onSensorChanged (SensorEvent event){
switch (event.sensor.getType ()){
case Sensor.TYPE_ACCELEROMETER:
aValues = event.values.clone ();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
mValues = event.values.clone ();
break;
}
float[] R = new float[16];
float[] orientationValues = new float[3];
SensorManager.getRotationMatrix (R, null, aValues, mValues);
SensorManager.getOrientation (R, orientationValues);
orientationValues[0] …Run Code Online (Sandbox Code Playgroud) 我必须做的一个设计DownloadManager,但我的主要问题是关系到一个通知Download可以发送到DownloadManager像onUpdate()更新进度条,onError(),onFinish(),等不知不觉中,这些DownloadManager具有从其收到此通知Download秒.
我想过两种可能的方法:
观察者模式
基本上有1个Observable和N Observers.在我的情况下,DownloadManager有一个Observer和下载Observables,因此关系是N Observables 1 Observer,恰恰相反.
优点是将所有可能的通知集中在一个方法中,来自Observers 的notify()or update()(from java)方法,在我的例子中只有DownloadManager.我可以使用通知代码将参数传递给notify()方法.
坏处?我正在使用oop模式来完成一个可以通过回调轻松完成的事情.此外,N观察者1观察者它是奇怪的,至少对于观察者模式,因为这个模式是为1个可观察的N个观察者完成的,所以我真的不会使用观察者模式.
打回来
与观察者模式非常相似.DownloadManager实现了一个"监听器"(接口).此侦听器实现onFinish(),onUpdate()等通知函数.然后,此侦听器必须在所有下载中注册,因此当下载完成时,它将调用listener.onFinish().另外,我可以从下载中将参数传递给此方法,就像在观察者模式中一样.
优点:易于使用.缺点:没有.
我可能会使用回调,因为在我看来,对一个观察者N观察者使用观察者模式是没有意义的.
而你,哪个选项会用?