gpt4 book ai didi

javascript - Promise 的 then 处理程序中的同步代码

转载 作者:行者123 更新时间:2023-11-30 16:08:43 25 4
gpt4 key购买 nike

我需要在解决异步 Promise 后执行一些同步代码。目前我的代码如下所示:

console.log("Starting");

promiseFunc().
then(function() {
console.log("PromiseFunc done. Doing Synchronous work...");
synchronousFunc1();
synchronousFunc2();
console.log("Synchronous work done");
}).
catch(function(err) {
console.log("Error:" + err);
}).
then(function() {
console.log("Done")
});

一切正常:第一个 thenpromiseFunc 解析后执行,最后一个 then 最后执行。我认为规范希望我从 then 返回一个新的 Promise 或一个值,但我无法返回任何有用的东西。

这是我的问题:

  1. 这种在 promise 解决后执行同步代码的“模式”是否有意义?可以从 then block 返回 undefined 吗?
  2. 如果有人决定用一个 promise 来实现 synchronousFunc1 会发生什么?这将打破执行顺序。我认为不应该做出这样的重大改变。相反,应该实现另一个 asynchronousFunc1。我说得对吗?
  3. 我的catch/then 实现怎么样?最后的 then 应该总是被执行。如果在 catch 处理程序中抛出异常,我认为这将不起作用。有其他选择吗?我知道 bluebird 中有一个 finally 处理程序,但我只想使用标准的 Promise 功能。

最佳答案

Does this 'pattern' for executing synchronous code after a promise is resolved make sense?

是的。这就是我们所做的。

Is it okay to return undefined from the then block?

并非如此,每项工作都应该有一个结果(否则它就毫无意义)并且你应该返回那个。但是如果你的函数只是执行副作用,那么返回 undefined 就是结果,所以没关系。

What happens if someone decides to implement synchronousFunc1 with a promise? This will break the order of execution.

是的,这是一个重大变化。

I think such a breaking change shouldn't be made. Instead another asynchronousFunc1 should be implemented. Am I right?

如何处理重大更改取决于图书馆的政策及其与调用者的契约(Contract)。它可能是一个主要版本更新,它可能是一个新功能,它可能是任何东西;当然应该适本地宣布它。无论如何,您都必须更改代码。

如果函数的名称暗示它是同步的,它不应该返回一个 promise ;在这种情况下,名称应该随着实现而改变。

What about my catch/then implementation? The final then should be executed always. I think this will not work, if an exception is thrown in the catch handler.

正确。您必须确保 catch 处理程序不会抛出 :-)

Are there alternatives? I know there is a finally handler in bluebird, but I want to use standard Promise features only.

如果您使用的是 bluebird ,您应该使用finally。无论如何它都可能成为标准化的,许多其他库也支持它。如果没有,您可以随时 shim it yourself .它的实现优于您的实现,尤其是在返回值和适当处理取消等事情方面。

关于javascript - Promise 的 then 处理程序中的同步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36605186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com