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

时间:2015-09-03 20:00:29

标签: javascript async-await promise es6-promise ecmascript-7

我想用babel运行这段代码:

redisClientAsync.delAsync('key');
return await someOtherAsyncFunction();

在没有等待第一行的异步函数中。这样好吗?

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

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

3 个答案:

答案 0 :(得分:11)

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

然而,这意味着当承诺被拒绝时,您不会注意到。您只需https://msdn.microsoft.com/en-us/library/office/aa223584%28v=office.11%29.aspx

  

这样好吗?我该怎么办一些我不在乎的东西?

可能不行。如果你真的不在乎,你一开始就没有运行它。因此,您应该清楚明确地表达您关心的内容(以及不重要​​的内容):

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

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

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

如果您不关心异常,可以使用

忽略它们
… someAsyncFunction().catch(function ignore() {}) …

你可以扔掉它,等待它,用它做任何事情。

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

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

答案 1 :(得分:1)

  在没有等待第一行的异步函数内部

。这样好吗?

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

  

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

在许多方面,无论如何简单地调用promise函数都有效。没有回调的del可能会在这种情况下起作用,但有些函数不能防止不传递回调,所以你可以改为传递一个空函数(.del('key', () => {}))。

您确实希望确保知道有关它失败,即使您不想破坏代码的操作 - 所以请考虑添加process.on("unhandledRejection',事件处理程序明确忽略这些特殊异常或通过以下方式禁止它们:

redisClient.delAsync('key').catch(()=>{});

或者最好是:

redisClient.delAsync('key').catch(logErr);

答案 2 :(得分:0)

从我迄今为止所做的所有研究来看,我认为这样做是可以的,只要您保证您不await保证执行的功能以某种方式在发生这种情况时处理自己的错误。例如,一个 try-catch 包装了整个函数体,就像您在以下 asyncFunction 片段中看到的那样。

函数是同步抛出还是异步抛出并不重要。它保证您的mainFunction 将完成,无论如何。这是这里的关键点。

如果你不保证,你就必须承担风险:

  • 如果它同步抛出,您的主函数将无法完成。
  • 如果它异步抛出,你会得到一个未处理的异常

// THIS IS SOME API CALL YOU DON'T WANT TO WAIT FOR

const mockAPI = () => {
  console.log("From mockAPI");
  return new Promise((resolve,reject) => {
    setTimeout(() => reject("LATE THROW: API ERROR"), 500);
  });
};

// THIS IS THE SOME ASYNC FUNCTION YOU CALL BUT NOT AWAIT FOR

const asyncFunction = async (syncThrow) => {
  try {
    console.log("Async function START");
    if (syncThrow) throw new Error("EARLY THROW");
    await mockAPI();
    console.log("Async function DONE");
  }
  catch(err) {
    console.log("From async function catch");
    console.log(err.message || err);
    return;
  }
};

// THIS IS YOUR MAIN FUNCTION

const mainFunction = async (syncThrow) => {
  try {
    console.clear();
    console.log("Main function START");
    asyncFunction(syncThrow);
    console.log("Main function DONE <<< THAT'S THE IMPORTANT PART");
  }
  catch(err) {
    console.log("THIS WILL NEVER HAPPEN");
    console.log(err);
  }
};
<div>
  <button onClick="mainFunction(true)">Sync throw</button>
  <button onClick="mainFunction(false)">Async throw</button>
</div>