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

IT技术 javascript async-await promise es6-promise ecmascript-2016
2021-02-06 11:25:24

我想用 babel 运行这段代码:

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

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

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

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

3个回答

是的,您可以这样做,它会并行运行两个异步函数。您刚刚创建了一个Promise并将其丢弃。

然而,这意味着当Promise被拒绝时,你不会注意到。最终得到一个unhandledRejection如果不处理会导致你的进程崩溃。

这个可以吗?我怎么能运行我不关心的东西?

恐怕不行。如果你真的不关心,你一开始就没有运行它。所以你应该清楚明确你关心什么(以及不关心什么):

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

如果你只想等待而不关心结果值,你可以很容易地把结果扔掉:

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;
如果解决,会调用下一个 .then 吗?我不想这样。
2021-03-16 11:25:24
@mylord 我不知道你的意思。onfulfill回调总是在Promise履行时被调用。
2021-03-16 11:25:24
@mylord 如果您在第 7 行返回,则第 10 行将仅在promisifiedFunction()Promise履行执行。如果不这样做,它将在Promise链(与promisifiedFunction()现在完全无关)完成时执行。如果您对此仍有问题,您可能应该提出一个包含完整示例和描述的新问题
2021-03-24 11:25:24
谢谢那是全面的。如果我不想要结果,错误,我不想等待异步函数中最好的东西。运行Promise或使用空(或函数不做任何事情)回调运行正常函数(非Promise)?
2021-03-25 11:25:24
在这种情况下,您可能也可以省略Promise。我仍然会传递一个明确不做任何事情的回调,以表明它是异步的,但你忽略了错误。
2021-03-25 11:25:24

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

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

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

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

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

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

或者最好是这样的:

redisClient.delAsync('key').catch(logErr);
很好的解释。
2021-03-11 11:25:24
我觉得这个答案比另一个答案更好地回答了这个问题。
2021-04-07 11:25:24

来自全国到目前为止,我所做的研究,我认为它的优良做到这一点,只要你保证你不会在函数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>