所以,我正在测试一个依赖于事件发射器的组件.为此,我想出了一个使用Promise with Mocha + Chai的解决方案:
it('should transition with the correct event', (done) => {
const cFSM = new CharacterFSM({}, emitter, transitions);
let timeout = null;
let resolved = false;
new Promise((resolve, reject) => {
emitter.once('action', resolve);
emitter.emit('done', {});
timeout = setTimeout(() => {
if (!resolved) {
reject('Timedout!');
}
clearTimeout(timeout);
}, 100);
}).then((state) => {
resolved = true;
assert(state.action === 'DONE', 'should change state');
done();
}).catch((error) => {
assert.isNotOk(error,'Promise error');
done();
});
});
Run Code Online (Sandbox Code Playgroud)
在控制台上我得到一个'UnhandledPromiseRejectionWarning',即使拒绝函数被调用,因为它立即显示消息'AssertionError:Promise error'
(node:25754)UnhandledPromiseRejectionWarning:未处理的promise拒绝(拒绝id:2):AssertionError:Promise错误:expect {Object(message,showDiff,...)}是假的1)应该转换为正确的事件
然后,在2秒后我得到了
错误:超过2000毫秒的超时.确保在此测试中调用done()回调.
自从执行catch回调以来,这甚至更奇怪.(我认为由于某种原因,断言失败阻止了其余的执行)
现在有趣的是,如果我注释掉 …
我正在尝试创建一个类,它有一个构造函数,只需要一个参数.当我创建对象的新实例时,它返回一个指针.
class Adder
def initialize(my_num)
@my_num = my_num
end
end
y = Adder.new(12)
puts y
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?谢谢
我使用Tab Control创建了一个Windows窗体,但它有一个标题.我想隐藏它.我无法使用Tab Control的任何属性来执行此操作.是否有任何属性被定义为隐藏Tab控件的选项卡标题而不通过代码?
我正在尝试编写一个通用函数,该函数可以通过键名切换任何对象中的布尔属性。我阅读了TypeScript-2.8的发行说明,并认为条件类型应该可以解决此类问题。但是,我无法弄清楚如何编写我的函数。
我的函数接受要修改的对象和要修改的键的名称。为了确保只传入布尔属性的键,我使用了条件类型表达式T[K] extends boolean ? K : never
。据我了解,如果我尝试传递非布尔属性的密钥,这应该会导致错误,因为T[K]
不会满足extends boolean
. 但是如果我试图传递一个布尔值的键,那么它应该接受那个K
.
然而,似乎即使有这个条件,TypeScript 也没有实现T[K] extends boolean
必须为真的函数。所以我不能将从对象读取的值分配回对象。这会导致下面显示的第一个错误。第二个错误是类型推断似乎不适用于我的函数。在下面的调用中,到目前为止只有第二个通过了 TypeScript 的检查。
function invertProperty<T, K extends keyof T> (o:T, propertyName:(T[K] extends boolean ? K : never)) {
o[propertyName] = !o[propertyName]; // Type 'false' is not assignable to type 'T[T[K] extends boolean ? K : never]'. [2322]
}
const myObject:IObject = {
a: 1,
b: true,
c: 'hi',
};
invertProperty(myObject, 'b'); // Argument …
Run Code Online (Sandbox Code Playgroud) 我正在使用Entity Framework Code First和Code First迁移.
在迁移期间,我需要创建一个新表,然后将一些数据插入其中.
所以我创建表:
CreateTable("MySchema.MyNewTable",
c => new
{
MYCOLUMNID = c.Int(nullable: false, identity: true),
MYCOLUMNNAME = c.String(),
})
.PrimaryKey(t => t.MYCOLUMNID);
Run Code Online (Sandbox Code Playgroud)
然后我尝试插入数据:
using (var context = new MyContext())
{
context.MyNewTableDbSet.AddOrUpdate(new[]
{
new MyNewTable
{
MYCOLUMNNAME = "Test"
}
});
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
无效的对象名称'mySchema.MyNewTable'.
有可能做我需要的吗?在同一个迁移中创建一个表和inserto数据?
我已经有其他迁移,我在其中创建表或将数据插入表中,但从未在同一个迁移中...
move C:\%USERNAME%\Desktop\TZClock C:\%USERNAME%\Start Menu\Programs\TZClock
Run Code Online (Sandbox Code Playgroud)
我不断得到系统找不到指定的路径.但我可以导航到它.是否MOVE
只对文件的工作?
我真的很喜欢使用C#5.0异步编程.但是,有些地方更新旧代码以与TAP模型保持一致会给我带来问题.
这是其中之一 - 我不确定为什么Task<TResult>
在TResult中没有协变,但是在尝试更新协变接口以从同步模式转换为异步模式时,它会给我带来问题:
旧代码:
public interface IInitializable<out T> // ** out generic modifier **
{
/// <summary>
/// Boolean to indicate if class is ready
/// </summary>
bool IsInitialized { get; }
/// <summary>
/// Calls for instance to be initialized using current parameters
/// Driver initialization can be done in the default constructor if desired
/// </summary>
T Initialize();
}
Run Code Online (Sandbox Code Playgroud)
新代码(不会编译):
public interface IAsyncInitializable<out T> // ** out generic modifier...broken **
{
/// <summary>
/// Boolean …
Run Code Online (Sandbox Code Playgroud) 在程序中,我使用dynamic
关键字来调用最佳匹配方法.但是,我发现框架StackOverflowException
在某些情况下会崩溃.
我试图尽可能地简化我的代码,同时仍能够重新产生这个问题.
class Program
{
static void Main(string[] args)
{
var obj = new SetTree<int>();
var dyn = (dynamic)obj;
Program.Print(dyn); // throws StackOverflowException!!
// Note: this works just fine for 'everything else' but my SetTree<T>
}
static void Print(object obj)
{
Console.WriteLine("object");
}
static void Print<TKey>(ISortedSet<TKey> obj)
{
Console.WriteLine("set");
}
}
Run Code Online (Sandbox Code Playgroud)
如果新建的实例实现了接口并打印了"对象",则该程序通常会打印"set" ISortedSet<TKey>
.但是,通过以下声明,将StackOverflowException
抛出a (如上面的注释中所述).
interface ISortedSet<TKey> { }
sealed class SetTree<TKey> : BalancedTree<SetTreeNode<TKey>>, ISortedSet<TKey> {}
abstract class BalancedTree<TNode>
where TNode : …
Run Code Online (Sandbox Code Playgroud) 我已经尝试过这个,它允许null
,undefined
和完全省略要保存的密钥:
{
myField: {
type: String,
validate: value => typeof value === 'string',
},
}
Run Code Online (Sandbox Code Playgroud)
这不允许''
(空字符串)被保存:
{
myField: {
type: String,
required: true,
},
}
Run Code Online (Sandbox Code Playgroud)
如何在不禁止空字符串的情况下强制一个字段是 aString
并且存在并且既不在 Mongoose 中null
也不undefined
在 Mongoose 中?
我有一种情况,我觉得在现实世界中等待一段时间的周期性动作之间有一段延迟而不是等待系统时钟嘀嗒几次.通过这种方式,我可以更新在不同系统上跟踪的租约/在实际经过一段时间后实时超时.
我怀疑Task.Delay
可能已经有这种行为,但我想确定,所以我写了一个测试程序(见下文).我的发现是,Task.Delay
当系统暂停和恢复时,行为完全不同.从观察其行为开始,Task.Delay
就像它:
有没有办法以await
这样一种方式,我可以在一定量的实时通过后运行任务,以便如果系统或进程在延迟过期后恢复,我的继续可以被触发?现在,作为一种解决方法,无论何时Task.Delay
到期或SystemEvents.PowerModeChanged
火灾,我都会继续Resume
.这是处理这种情况的正确方法吗?对我来说,用这种方式编写两个用于不同目的的API似乎很奇怪,我很惊讶地看到它SystemEvents.PowerModeChanged
存在.此外,我担心这个API在Microsoft.Win32
命名空间中可能不是可移植的.
using Microsoft.Win32;
using System;
using System.Threading.Tasks;
class Program
{
static int Main(string[] args) => new Program().Run(args).Result;
async Task<int> Run(string[] args)
{
SystemEvents.PowerModeChanged += (sender, e) => Console.WriteLine($"{e}: {e.Mode}");
var targetTimeSpan = TimeSpan.FromSeconds(20);
var start = DateTime.UtcNow;
var task = Task.Delay(targetTimeSpan);
var tickerTask = Tick(targetTimeSpan);
Console.WriteLine($"Started at {start}, waiting {targetTimeSpan}.");
await task;
var end = DateTime.UtcNow; …
Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×3
async-await ×1
c#-5.0 ×1
chai ×1
class ×1
cmd ×1
constructor ×1
covariance ×1
delay ×1
dynamic ×1
javascript ×1
mocha.js ×1
mongoose ×1
node.js ×1
promise ×1
ruby ×1
typescript ×1
windows ×1
winforms ×1