使用超时实现函数调用
我已经看到许多资源提供Promise.race了在给定时间段内使用超时函数调用的类似示例.这是如何Promise.race在实践中使用的一个很好的例子.这是一些示例代码:
function doWithinInterval(func, timeout) {
var promiseTimeout = new Promise(function (fulfill, reject) {
// Rejects as soon as the timeout kicks in
setTimeout(reject, timeout);
});
var promiseFunc = new Promise(function (fulfill, reject) {
var result = func(); // Function that may take long to finish
// Fulfills when the given function finishes
fulfill(result);
});
return Promise.race([promiseTimeout, promiseFunc]);
}
Run Code Online (Sandbox Code Playgroud)
上面使用的简单方法Promise.race一旦超时func完成就会拒绝承诺.否则,一旦func函数在超时间隔之前完成,项目就会完成.
这听起来不错,易于使用.
但是,这是在Promise中使用超时的最佳做法吗?
当然,如果我们想使用Promises为函数调用设置超时,可以使用上面的方法.这些行动似乎仍然是一个很好的承诺.但是,这被认为是在Promise中使用超时的好方法吗?如果没有,使用它的缺点是什么?
我正在寻找替代方法,但找不到本机的Promise方法来做到这一点.
相反,一些外部Promise库提供timeout如下功能:
蓝鸟供应.timeout() …
我正在使用Mocha为我的简单Node.js应用程序编写单元测试.该应用程序有一个类,它连接到Mongo数据库,获取记录,并将制定的记录存储为字段.简单来说,这个类看起来像这样:
SampleClass.prototype.record = []; // Store the loaded record
SampleClass.prototype.init = function(db){
var self = this;
self.db = mongoose.connection; // Say we already have mongoose object initialized
self.db.once('open',function(){
/* schema & model definitions go here */
var DataModel = mongoose.model( /* foobar */);
DataModel.findOne(function(err,record){
/* error handling goes here */
self.record = record; // Here we fetch & store the data
});
});
}
Run Code Online (Sandbox Code Playgroud)
从上面的代码片段可以看出,一旦调用了SampleClass.init(),Sample.record就不会立即从数据库中填充.一旦触发事件'open',数据就会异步填充.因此,在SampleClass.init()之后可能会有一个延迟,直到填充Sample.record.
因此,当我编写像这样的Mocha测试时会出现并发症:
var testSampleClass = new SampleClass();
describe('SampleClass …Run Code Online (Sandbox Code Playgroud) 我有一些JSON数据如下:
{
version: 1,
partitions: {
'0': [ 1616133379 ],
'1': [ 1616133378 ],
'2': [ 1616133380 ]
}
}
Run Code Online (Sandbox Code Playgroud)
我使用async.each循环遍历数据,如下所示:
async.each(topicData.partitions, function(data, callback){
console.log('/brokers/topics/' + topic + '/partitions/' + data + '/state');
callback();
},
function(err){
if(err) {
console.log(err);
callback(err);
}
});
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
'/ brokers/topics/testing/partitions/1616133379/state''/ brokers/topics/testing/partitions/1616133378/state''/ brokers/topics/testing/partitions/1616133380/state'
正如您所看到的,data通过async.each函数传递的项目保持键/值对的值,而我实际上希望它传递键以产生此输出:
'/ brokers/topics/testing/partitions/0/state''/ brokers/topics/testing/partitions/1/state''/ broker/topics/testing/partitions/2/state'
无论如何我可以获得传递的密钥而不是价值吗?
这必须异步运行.
谢谢
例如,如果在git上有4个分支,就像这样:
branch1
branch2* (current branch)
branch3 (newest commits here)
master (oldest)
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如何从git命令行检查我当前的分支是否是最新的权限?如果没有,哪个分支是最新的?我的意思是哪个分支包含最新的提交?
如何在没有切换当前分支的情况下列出比我的分支更新的git存储库(在任何分支中)的所有提交?
刚刚在JavaScript中使用了不寻常的按位操作,在某些情况下我得到了一些奇怪的结果:
通常情况
1 << 0 // returns 1, makes sense
100 << 0 // returns 100, makes sense
100 >> 0 // returns 100, definitely makes sense
Run Code Online (Sandbox Code Playgroud)
但是这些,当移位0位时,所有产生零
9E99 << 0 // returns 0 ..... Why all bits are cleared?
9E99 >> 0 // returns 0 also ..... All bits cleared?
Infinity >> 0 // returns 0
Infinity << 0 // returns 0
-Infinity << 0 // returns 0 .... Can't explain why
-0 << 0 // also yields 0 …Run Code Online (Sandbox Code Playgroud) 我用下面列出的代码做了一些测试:
function foo(x) {
alert(y);
}
var y = 'I am defined outside foo definition';
foo();
Run Code Online (Sandbox Code Playgroud)
上面的代码给了我一个警告“我被定义在 foo 定义之外”。
然后另一个测试:
function bar(x) {
alert(x);
}
var x = 'I am defined outside foo definition';
bar();
function bar(x) {
alert(x);
}
x = 'I am defined outside bar definition';
bar();
Run Code Online (Sandbox Code Playgroud)
以上两个代码都给我一个警告“未定义”。
所以为什么?
function initTimer(timeLeft) {
var Me = this,
TotalSeconds = 35,
Seconds = Math.floor(timeLeft);
var x = window.setInterval(function() {
var timer = Seconds;
if(timer === -1) { clearInterval(x); return; }
$('#div').html('00:' + (timer < 10 ? '0' + timer : timer));
Seconds--;
},1000);
}
Run Code Online (Sandbox Code Playgroud)
我有这个代码。一切正常,当此选项卡在浏览器中处于活动状态时,但是当我更改选项卡并稍后返回选项卡时,它会出现问题。更准确地说,它错误地显示了时间。
我也试过 setTimeout,但问题是一样的。
我的一个想法是:HTML5 Web Workers ...
但这里有另一个问题...浏览器支持。
有人可以帮助解决这个问题吗?即使选项卡未处于活动状态,我如何编写可以正常工作的 setInterval
我对ifc ++中的语句有一个小问题.以下是代码片段:
string answer;
cin >> answer;
if (answer == "stay in bed")
{
cout << "You lay there, motionless. Silent.";
}
else if (answer == "go to the bathroom")
{
cout << "You get up and walk across the hall to the bathroom.";
}
else if (answer == "go downstairs")
{
cout << "You get up and walk down the stairs to the kitchen.";
}
else
{
cout << "That is not a valid answer...";
}
Run Code Online (Sandbox Code Playgroud)
当我输入任何值时,我从 …
我刚刚发现我可以在JavaScript中定义一个函数,如下所示:
function a(){ ([]()) }
Run Code Online (Sandbox Code Playgroud)
同样,这种方式也是一个有效的函数定义.
function a(){ ([]())()()([])([]) }
Run Code Online (Sandbox Code Playgroud)
它甚至看起来不像一个有效的语法,不是吗?但是编译器在定义它们时不会责怪它们.(当然,调用a()会导致错误)
空数组的功能?一个空数组函数的函数,还是什么?我甚至无法理解这被认为是有效的被定义为JavaScript编译器中的函数.
如果你很好奇:并非所有这些函数定义都会通过编译器.您可以尝试在下面定义.
function a(){ ([]())()()([])([]){} }
Run Code Online (Sandbox Code Playgroud)
JS编译器不会让你定义它.
我知道函数将无法调用,但令我疑惑的是,我可以定义它.所以我很想知道为什么这个定义是有效的.
javascript ×7
asynchronous ×1
c++ ×1
codeblocks ×1
ecmascript-6 ×1
es6-promise ×1
function ×1
git ×1
git-branch ×1
if-statement ×1
jquery ×1
mocha.js ×1
mongodb ×1
node.js ×1
promise ×1
scope ×1
setinterval ×1
unit-testing ×1