小编bin*_*nki的帖子

NodeJS UnhandledPromiseRejectionWarning

所以,我正在测试一个依赖于事件发射器的组件.为此,我想出了一个使用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回调以来,这甚至更奇怪.(我认为由于某种原因,断言失败阻止了其余的执行)

现在有趣的是,如果我注释掉 …

javascript mocha.js node.js promise chai

113
推荐指数
4
解决办法
30万
查看次数

Ruby对象打印为指针

我正在尝试创建一个类,它有一个构造函数,只需要一个参数.当我创建对象的新实例时,它返回一个指针.

class Adder
    def initialize(my_num)
        @my_num = my_num
    end
end
y = Adder.new(12)
puts y
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?谢谢

ruby constructor initialization class

40
推荐指数
2
解决办法
8万
查看次数

如何在Windows窗体中创建没有选项卡标题的选项卡控件?

我使用Tab Control创建了一个Windows窗体,但它有一个标题.我想隐藏它.我无法使用Tab Control的任何属性来执行此操作.是否有任何属性被定义为隐藏Tab控件的选项卡标题而不通过代码?

.net c# winforms

31
推荐指数
1
解决办法
3万
查看次数

我如何要求 keyof 用于特定类型的属性?

我正在尝试编写一个通用函数,该函数可以通过键名切换任何对象中的布尔属性。我阅读了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)

typescript

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

在EF代码首次迁移期间创建表并将数据插入其中

我正在使用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数据?

我已经有其他迁移,我在其中创建表或将数据插入表中,但从未在同一个迁移中...

c# entity-framework ef-migrations entity-framework-6

12
推荐指数
4
解决办法
2万
查看次数

命令提示符:当我将文件夹(包含内容)从桌面移动到新目录时,为什么会出现"找不到指定的路径"?

move C:\%USERNAME%\Desktop\TZClock C:\%USERNAME%\Start Menu\Programs\TZClock
Run Code Online (Sandbox Code Playgroud)

我不断得到系统找不到指定的路径.但我可以导航到它.是否MOVE只对文件的工作?

windows cmd command-prompt

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

可以/应该将任务<TResult>包装在C#5.0中,等待TResult中的协变吗?

我真的很喜欢使用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)

c# covariance task-parallel-library async-await c#-5.0

11
推荐指数
2
解决办法
1463
查看次数

通过动态访问泛型类型的成员时的StackOverflowException:.NET/C#framework bug?

在程序中,我使用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)

.net c# dynamic

11
推荐指数
2
解决办法
836
查看次数

在猫鼬中,我如何要求字符串字段不为空或未定义(允许长度为 0 的字符串)?

我已经尝试过这个,它允许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 中?

mongoose mongoose-schema

11
推荐指数
2
解决办法
7773
查看次数

有没有`Task.Delay`的变体在实时通过后到期,例如即使系统被暂停和恢复?

我有一种情况,我觉得在现实世界中等待一段时间的周期性动作之间有一段延迟而不是等待系统时钟嘀嗒几次.通过这种方式,我可以更新在不同系统上跟踪的租约/在实际经过一段时间后实时超时.

我怀疑Task.Delay可能已经有这种行为,但我想确定,所以我写了一个测试程序(见下文).我的发现是,Task.Delay当系统暂停和恢复时,行为完全不同.从观察其行为开始,Task.Delay就像它:

  • 将计数器设置为此通过时间所需的计时器滴答数.
  • 每次计时器滴答时计数减少.
  • 当计数器达到0时,标记为已完成.

有没有办法以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)

.net c# delay task-parallel-library

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