我可以解雇并忘记nodejs(ES7)中的承诺吗?

ari*_*xis 8 javascript promise async-await es6-promise ecmascript-7

我想用babel运行这段代码:

redisClientAsync.delAsync('key');
return await someOtherAsyncFunction();
Run Code Online (Sandbox Code Playgroud)

在没有等待第一行的异步函数内部.这个可以吗?

我怎么能运行一些我不在乎的东西?

我可以在没有回调的情况下触发非promisified函数del('key',null)吗?

Ben*_*aum 16

在异步函数中,无需等待第一行。这个可以吗?

是的,在某些情况下,您想要这样做是完全合理的。特别是在您不关心结果的情况下 - 一个示例是不应干扰业务关键代码的分析跟踪操作。

我怎么能运行我不关心的东西?

在许多方面,但是简单地调用 promise 函数是可行的。del在这种情况下,您没有回调可能会起作用,但某些函数不会防止不传递回调,因此您可以改为传递一个空函数 ( .del('key', () => {}))。

但是,您确实希望确保您知道它失败,即使您不想中断代码的操作 - 因此请考虑添加process.on("unhandledRejection',事件处理程序以显式忽略这些特定异常或通过以下方式抑制它们:

redisClient.delAsync('key').catch(()=>{});
Run Code Online (Sandbox Code Playgroud)

或者最好是这样的:

redisClient.delAsync('key').catch(logErr);
Run Code Online (Sandbox Code Playgroud)

  • 我觉得这个答案比另一个答案更好地回答了这个问题。 (3认同)

Ber*_*rgi 15

是的,你可以这样做,它将并行运行两个异步函数.你刚刚创造了一个承诺并把它抛弃了.

但是,这意味着当承诺被拒绝时,您将不会注意到.你最终得到一个unhandledRejection.

这个可以吗?我该怎么办一些我不在乎的东西?

可能不行.如果你真的不在乎,你首先没有运行它.所以你应该清楚明确你所关心的(以及不是):

  • 你想等吗?(副作用)
  • 你需要结果吗?
  • 你想捕捉异常吗?

如果您只想等待并且不关心结果值,则可以轻松地丢弃结果:

void (await someAsyncFunction()); // or omit the void keyword,
                                  // doesn't make a difference in an expression statement
Run Code Online (Sandbox Code Playgroud)

如果您不关心异常,可以使用它们来忽略它们

… someAsyncFunction().catch(function ignore() {}) …
Run Code Online (Sandbox Code Playgroud)

你可以抛弃它,等待它,用它做任何事情.

如果你想要结果,你必须等待它.如果您关心异常,但实际上并不想等待,您可能希望与以下函数并行执行:

var [_, res] = await Promise.all([
    someAsyncFunction(), // result is ignored, exceptions aren't
    someOtherAsyncFunction()
]);
return res;
Run Code Online (Sandbox Code Playgroud)