小编Tao*_*oPR的帖子

在promise中超时函数的最佳通用做法是什么?

使用超时实现函数调用

我已经看到许多资源提供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如下功能:

javascript promise ecmascript-6 es6-promise

15
推荐指数
2
解决办法
4948
查看次数

如何在启动Mocha测试用例之前添加延迟?

我正在使用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)

javascript unit-testing mocha.js mongodb node.js

9
推荐指数
2
解决办法
1万
查看次数

使用async.each获取对象密钥

我有一些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'

无论如何我可以获得传递的密钥而不是价值吗?

这必须异步运行.

谢谢

javascript asynchronous

7
推荐指数
1
解决办法
6525
查看次数

如何快速检查哪个Git分支是最新的?

例如,如果在git上有4个分支,就像这样:

branch1
branch2* (current branch)
branch3 (newest commits here)
master (oldest)
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 如何从git命令行检查我当前的分支是否是最新的权限?如果没有,哪个分支是最新的?我的意思是哪个分支包含最新的提交?

  • 如何在没有切换当前分支的情况下列出比我的分支更新的git存储库(在任何分支中)的所有提交?

git git-branch

4
推荐指数
1
解决办法
107
查看次数

为什么在JavaScript中使用0进行逐位移位会在某些情况下产生奇怪的结果

刚刚在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)

javascript bitwise-operators

4
推荐指数
1
解决办法
287
查看次数

JavaScript 函数参数和作用域

我用下面列出的代码做了一些测试:

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)

以上两个代码都给我一个警告“未定义”。

所以为什么?

javascript scope function

4
推荐指数
1
解决办法
2190
查看次数

选项卡未处于活动状态时,Javascript setInterval 无法正常工作

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

javascript jquery setinterval

2
推荐指数
1
解决办法
1595
查看次数

"如果"语句没有正确执行c ++

我对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)

当我输入任何值时,我从 …

c++ if-statement codeblocks

1
推荐指数
1
解决办法
155
查看次数

为什么这是一个有效的JavaScript函数定义?很奇怪(但肯定无法运行)

我刚刚发现我可以在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

-1
推荐指数
1
解决办法
90
查看次数