如何在一定时间后超时承诺?我知道Q有一个承诺超时,但我使用的是本机NodeJS承诺而且它们没有.timeout函数.
我错过了一个或其包装不同吗?
或者,下面的实现是否有利于不吸收内存,实际上按预期工作?
我也可以以某种方式将其全局包装,以便我可以将它用于我创建的每个承诺,而不必重复setTimeout和clearTimeout代码?
function run() {
logger.info('DoNothingController working on process id {0}...'.format(process.pid));
myPromise(4000)
.then(function() {
logger.info('Successful!');
})
.catch(function(error) {
logger.error('Failed! ' + error);
});
}
function myPromise(ms) {
return new Promise(function(resolve, reject) {
var hasValueReturned;
var promiseTimeout = setTimeout(function() {
if (!hasValueReturned) {
reject('Promise timed out after ' + ms + ' ms');
}
}, ms);
// Do something, for example for testing purposes
setTimeout(function() {
resolve();
clearTimeout(promiseTimeout);
}, ms - 2000);
});
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在使用NodeJS和Express,当我在URL中使用外来字符时,它们会自动进行编码.
如何将其解码回原始字符串?
在调用NodeJS之前,我转义了字符.
所以字符串: ?????
变 %u05D0%u05D5%u05D1%u05DE%u05D4
整个网址现在看起来像: http://localhost:32323/?query=%u05D0%u05D5%u05D1%u05DE%u05D4
现在在我的NodeJS中,我得到了转义字符串%u05D0%u05D5%u05D1%u05DE%u05D4
.
这是相关代码:
var url_parts = url.parse(req.url, true);
var params = url_parts.query;
var query = params.query; // '%u05D0%u05D5%u05D1%u05DE%u05D4'
Run Code Online (Sandbox Code Playgroud)
我试过url
和querystring
库,但似乎没有什么适合我的情况.
querystring.unescape(query); // still '%u05D0%u05D5%u05D1%u05DE%u05D4'
Run Code Online (Sandbox Code Playgroud) 我正在使用ConEmu,我希望我的cmds 始终以管理员身份运行.
我已经更改了强制所有cmd运行通过ConEmu的设置,因此在Windows运行中输入'cmd'将打开ConEmu(设置 - >集成 - >默认术语 - >强制ConEmu作为默认终端)
我尝试更改(设置 - >启动 - >命令行)cmd.exe -new_console:a
适用于快捷方式,但不更改默认值(从运行中运行cmd或在ConEmu中打开新选项卡)
谢谢
如何获取当前排队的消息数?
我的代码基本上如下:
function readQueue() {
var open = require('amqplib').connect(config.rabbitServer);
open.then(function (conn) {
var ok = conn.createChannel();
ok = ok.then(function (ch) {
ch.prefetch(config.bulkSize);
setInterval(function () {
handleMessages();
}, config.bulkInterval);
ch.assertQueue(config.inputQueue);
ch.consume(config.inputQueue, function (msg) {
if (msg !== null) {
pendingMessages.push(msg);
}
});
});
return ok;
}).then(null, console.warn);
}
Run Code Online (Sandbox Code Playgroud)
我在文档中或调试时没有发现任何内容,并且我确实看到了允许此操作的不同库,因此想知道 amqplib 是否也支持此操作。
我的应用程序中有一个字段,用户可以在其中输入主题标签。\n我想验证他们的输入并确保他们输入正确的主题标签。\n它可以采用任何语言,并且前面不应带有# 符号。 \n我正在用 JavaScript 编写。
\n\n所以以下是很好的例子:
\n\n以下是不好的例子:
\n\n我们有一个仅匹配 a-zA-Z0-9 的正则表达式,我们需要添加语言支持,因此我们将其更改为忽略空格并忘记忽略特殊字符,所以我在这里。
\n\n我看到过一些其他 StackOverflow 示例,但对我不起作用:
\n\n\n\n[编辑]
\n\n我正在调用getImageData/putImageData,它会导致我的Chrome进程填满,直到它达到2.5Gb内存时崩溃.
我正在使用带有传单热图插件的simpleheat.js来在画布上显示热图.
基本上,我正在调用绘图fn以建立"随时间变化的热图"效果.我处理每个运行的数据(每个getImageData/putImageData)是4Mb,而以10-20 fps调用.
我想知道如何优化这段代码.我对使用画布知之甚少.
这是相关的代码simpleheat.js
:
draw: function() {
...
var colored = ctx.getImageData(0, 0, this._width, this._height);
this._colorize(colored.data, this._grad);
ctx.putImageData(colored, 0, 0);
},
_colorize: function (pixels, gradient) {
for (var i = 0, len = pixels.length, j; i < len; i += 4) {
j = pixels[i + 3] * 4; // get gradient color from opacity value
if (j) {
pixels[i] = gradient[j];
pixels[i + 1] = gradient[j + 1];
pixels[i + 2] = …
Run Code Online (Sandbox Code Playgroud) 一切都完全是理论上的,这个问题刚想到,我不完全确定答案是什么:
假设您有一个计算4个独立计算的应用程序.(完全独立,无论你做什么顺序并且你不需要计算另一个).还假设这些计算是长(分钟)和CPU绑定(不等待任何类型的IO)
1)现在,如果你有一个1处理器的计算机,单个线程应用程序在逻辑上会比多线程应用程序更快(或相同).由于计算机无法使用一个处理器一次做多件事,因此会浪费时间进行上下文切换等.到现在为止还挺好?
2)如果你有一台4处理器的计算机,4线程的速度通常比单线程更快.对?您的计算机现在可以一次执行4个操作,因此将您的应用程序划分为4个线程是合乎逻辑的,并且它应该以4个计算中最长的时间完成.到目前为止仍然很好?
3)现在我感到困惑的实际部分 - 为什么我的应用程序创建的线程数多于可用的处理器数量(实际上是核心数)?我已经编程并且已经看到了创建数十个和数百个线程的应用程序,但实际上 - 对于普通计算机来说,完美的数字大约为8?
PS我已经读过这个:线程与单线程 但没有安静的回答.
干杯
我正在使用Elasticsearch批量索引来更新文档的某些统计信息,但可能会发生我尝试更新的文档不存在 - 在这种情况下我希望它什么都不做.
在这种情况下,我不希望它创建文档.
我没有在文档中找到任何内容,或者可能错过了它.
我当前的操作(在这种情况下,它创建文档):
{
update: {
_index: "index1",
_type: "interaction",
_id: item.id
}
},
{
script: {
file: "update-stats",
lang: "groovy",
params: {
newCommentsCount: newRetweetCount,
}
},
upsert: normalizedItem
}
Run Code Online (Sandbox Code Playgroud)
如何仅在文档存在时更新文档,否则什么都没有?
谢谢
我正在使用Angular-Bootstrap Carousel指令,并在其上进行一些更改。轮播有ng-repeat
幻灯片。
我试图通过将左右控件悬停而不是单击来转到下一张/上一张幻灯片。并通过更改object.active
状态来实现(以前为false-新为true)
无论如何,几轮之后,我所有的物体都active=false
摆好了,转盘什么也没显示。在调试数组并$watch
在每个对象上发现错误后,是因为该指令以某种方式更改了active=false
我不希望的时间。
长话短说:我能以某种方式获取我正在使用的范围内的对象的调用堆栈$watch
吗?
例如,我的监视代码如下:
$scope.$watch('requestFilters[0]', function(obj) {
console.log('Item 0 changed');
}, true);
Run Code Online (Sandbox Code Playgroud) 我有一个功能downloadItem
可能会因网络原因而失败,我希望能够在实际拒绝该项目之前重试几次。重试需要超时,因为如果出现网络问题,则立即重试是没有意义的。
这是我到目前为止所拥有的:
function downloadItemWithRetryAndTimeout(url, retry, failedReason) {
return new Promise(function(resolve, reject) {
try {
if (retry < 0 && failedReason != null) reject(failedReason);
downloadItem(url);
resolve();
} catch (e) {
setTimeout(function() {
downloadItemWithRetryAndTimeout(url, retry - 1, e);
}, 1000);
}
});
}
Run Code Online (Sandbox Code Playgroud)
显然,这会失败,因为我第二次(以及第二次)打电话时,downloadItemWithRetryAndTimeout
我没有按要求返回承诺。
我如何让它与第二个承诺一起正常工作?
PS,如果代码在 NodeJS 中运行很重要。