小编edd*_*xie的帖子

让我们承诺在返回之前等待几秒钟

我有一个函数返回一个承诺.在此功能中,我们呼叫第三方供应商通过其服务器发送一些推送通知.

看起来像

apiGetLoggedInUser.then(
  user => {
    return sendMessage(user.name);
  }
)
Run Code Online (Sandbox Code Playgroud)

然而事情是我们决定等待3秒才真正调用这个sendMessage函数.但是我们宁愿不更改sendMessage,因为它已经提供了.

我想知道如何在这种情况下真正做"等待"部分,因为promise用于删除"同步"操作.

我理解正确吗?我该怎么办?

javascript node.js promise express

8
推荐指数
4
解决办法
6413
查看次数

在 Antlr 4 中重复评估同一访客

我使用语法构建了一个 Antlr 4 过滤器(在此处的上下文中并不重要),过滤器看起来像“年龄 > 30 AND 高度 < 6.1”。

然而,问题是,我会构建一次这个过滤器,并用它来评估可能有一千个文档。每个文档中都有一个“年龄”和“身高”属性。

但是我不确定的是,如何重用解析器或词法分析器,以便我可以加快评估速度。每次都构建一个词法分析器 && 解析器似乎真的是在浪费时间。

java代码是这样的

  public Boolean createFilterVisitor(String input, DocFieldAccessor docFieldAccessor) {
    FilterLexer lexer = new FilterLexer(CharStreams.fromString(input));
    lexer.removeErrorListener(ConsoleErrorListener.INSTANCE);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    FilterParser parser = new FilterParser(tokens);
    parser.addErrorListener(new FilterErrorListener());
    parser.removeErrorListener(ConsoleErrorListener.INSTANCE);

    FilterVisitorImpl filterVisitor = new FilterVisitorImpl(docFieldAccessor);

    return filterVisitor.visit(parser.filter());
  }
Run Code Online (Sandbox Code Playgroud)

进而

for doc in docs:
  createFilterVisitor(doc, someAccessor);
Run Code Online (Sandbox Code Playgroud)

我尝试构建一次词法分析器和解析器,然后在循环开始时执行 lexer.reset() 和 parser.reset()。它似乎有效(它过滤了合理的文档),但我不确定我是否做得正确。我不知道重置是什么意思,什么时候应该使用它

所以我的问题是:

  1. 如何解析过滤器字符串并构建一次解析器/词法分析器而不是为每个文档?
  2. 我是否正确使用了重置?

我有这个代码。这行得通吗?

public class KalaFilter {
  private final String filterClause;
  private FilterLexer lexer;
  private FilterParser parser;

  @Getter
  private …
Run Code Online (Sandbox Code Playgroud)

java parsing antlr antlr4

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

javascript 中的存根请求库

我正在使用第三方宁静服务发送短信验证码。我为它写了一个单元测试。但是,我不希望每次运行单元测试时都收到一条消息。

代码是这样的:

  const _request = require("request");

  _request({
  method: "POST",
  url: "http://blah.com/json",
  form: {
    apikey: "blah",
    mobile: input.mobilePhoneNumber,
    text: `code is: ${verificationCode}`,
  }
}, (err, res, body) => {
  if (err) {
    dbg(`end, output=${err}`)
    return reject(new Error("something wrong"))
  } else {
    dbg(`end, output=${res}`)
    return resolve({})
  }
})
Run Code Online (Sandbox Code Playgroud)

在测试中我使用 sinon.stub

sinon.stub(request, "post").returns(Promise.resolve({}))
Run Code Online (Sandbox Code Playgroud)

然而,这个存根并没有真正捕捉到请求中的“post”方法。我查看了源代码并尝试了很多方法(比如存根构造函数),但没有一个有效。

想知道有没有人以前试过这个。我应该如何根据要求存根这个 post 方法?

谢谢!

javascript unit-testing request mocha.js sinon

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

40秒奇怪的sql性能难题

我正在运行查询以更新我的用户的字段,如下所示:

UPDATE Members SET abc = abc + 1 where Members.id in (
SELECT DISTINCT(memberId) FROM Events WHERE Events.createdAt > "2017-08-06 13:10:00";
Run Code Online (Sandbox Code Playgroud)

令人震惊的是,有大约500名成员,这个查询运行40秒......

所以分解:

SELECT DISTINCT(memberId) FROM Events WHERE Events.createdAt > "2017-08-06 13:10:00"
Run Code Online (Sandbox Code Playgroud)

运行0.1秒,只有39行匹配.

会员总数仅为~500.我不明白为什么这会花很长时间......我错过了什么?

我正在使用mysql 5.6在RDS上运行

mysql sql

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