小编Dan*_*der的帖子

Express 中间件中的异步/等待

我无法理解如何在 Express 中正确编写使用 async/await 的中间件,但在执行后不会让 Promise 漂浮在以太坊中。我已经阅读了大量博客和 StackOverflow 帖子,似乎在 async/await 中间件中使用以下模式达成了一些共识:

const asyncHandler = fn => (req, res, next) =>
  Promise
    .resolve(fn(req, res, next))
    .catch(next)

app.use(asyncHandler(async (req, res, next) => {
  req.user = await User.findUser(req.body.id);
  next();
}));
Run Code Online (Sandbox Code Playgroud)

我知道这使得不必在所有 aysnc 路由处理程序中使用 try..catch 逻辑成为可能,并且它确保 (async (req, res, next) => {}) 返回的 Promise函数已解决,但我的问题是我们正在从 asyncHandler 的 Promise.resolve() 调用返回一个 Promise:

Promise
  .resolve(fn(req, res, next))
  .catch(next)
Run Code Online (Sandbox Code Playgroud)

并且永远不要在这个返回的 Promise 上调用 then()。使用这种模式是因为我们不依赖中间件函数的任何返回值吗?只返回 Promises 并且从不调用 then() 来获取它们的值是否可以,因为 Express 中的中间件没有返回有意义的值?

我知道 async/await 允许我们处理异步代码并轻松处理返回的值,但是在 Express 中间件中,我们只剩下顶级异步,它解析为 Promise,然后我们使用 Promise.resolve 解析(),但它仍然解析为一个 Promise ...... …

javascript middleware express async-await es6-promise

7
推荐指数
2
解决办法
8864
查看次数

Ruby使用特定键将Array转换为Hash值

有没有办法从数组中提取值并在Ruby中为每个值分配一个唯一的键?

我希望能够改变这个数组:

["12", "21", "1985"]
Run Code Online (Sandbox Code Playgroud)

进入这个哈希:

{:month => "12", :day => "21", :year => "1985"}
Run Code Online (Sandbox Code Playgroud)

我宁愿不单独分配每个值,如下所示:

arr = ["12", "21", "1985"]
bday_hash = {:month => arr[0], :day => arr[1], :year => arr[2]}
Run Code Online (Sandbox Code Playgroud)

ruby arrays hashmap

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

为什么这个条件语句永远不会执行?

我正在完成Oracle发布的"Java教程",我不知道为什么我无法从"并发"一章中获取本例中的条件语句来执行:

if ((System.currentTimeMillis() - startTime > patience) &&
                msgThread.isAlive())
Run Code Online (Sandbox Code Playgroud)

startTime变量在此上面初始化为:

long startTime = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)

耐心变量可以是硬编码值(1小时)或作为命令行参数传入的值(以秒为单位).

    long patience = 1000 * 60 * 60; // initially 1 hour of patience

    // if there is a command-line arg
    if (args.length > 0) {
        try {
            // takes command-line arg as seconds
            patience = Long.parseLong(args[0]) * 1000;
        }
        catch (NumberFormatException e) {
            System.err.println("Invalid commmand-line argument, " +
                "terminating...");
            System.exit(1);
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是,当我使用各种命令行参数运行程序时(即使我传入1,它应该在1秒后结束,我在响应中没有任何区别!),它们都没有实际获得条件语句是真的,然后会中断msgThread并在屏幕上打印一条消息:

        // if the amount of time passed is more than patience …
Run Code Online (Sandbox Code Playgroud)

java concurrency conditional multithreading

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