Javascript承诺调用;然后";立即

Javascript承诺调用;然后";立即,javascript,promise,Javascript,Promise,我正在开发的一个单页应用程序中广泛使用JavaScript。在某些上下文中,如果承诺已经得到解决,我需要同步运行“then”方法。为此,我编写了一个自定义的promise实现作为包装类,它工作得很好,但阻止我使用async/await。因此,我想知道是否有一种方法可以同时使用这两种语言,因为在我看来,async/await实际上只是围绕“then”的语法糖 自定义promise实现已经实现了类似PromiseLike的TypeScript接口,但显然async/await始终需要一个本机prom

我正在开发的一个单页应用程序中广泛使用JavaScript。在某些上下文中,如果承诺已经得到解决,我需要同步运行“then”方法。为此,我编写了一个自定义的promise实现作为包装类,它工作得很好,但阻止我使用async/await。因此,我想知道是否有一种方法可以同时使用这两种语言,因为在我看来,async/await实际上只是围绕“then”的语法糖

自定义promise实现已经实现了类似PromiseLike的TypeScript接口,但显然async/await始终需要一个本机promise。为什么?

我考虑过的一种可能性是替换真实承诺对象的“then”方法,而不是在上面构建自己的包装器。这样行吗

立即调用“then”很重要的原因是承诺链的末端是React组件的属性,并且React组件显示加载指示器,直到承诺得到解决。如果没有我的包装器,每次组件更新时都会短暂显示加载指示器,这也会中断一些用户交互

也许有不同的方法来解决这个问题。这是我第一次深入JavaScript世界

我使用的是TypeScript,目标是ES6

但显然async/await总是需要一个本机承诺

不,没有<代码>等待对具有
方法的对象起作用。然后
方法

如果没有我的包装器,每次组件更新时都会短暂显示加载指示器,这也会中断一些用户交互

这不是因为等待解决的承诺。
.then
在微任务中执行,这意味着如果承诺真的已经解决,那么
.then
将在引擎执行当前任务后直接执行,因此在浏览器重新启动之前执行

let promise = Promise.resolve(1);

setTimeout(() => { // Make sure the promise resolved
 console.log("sync");
 promise.then(() => console.log("then"));
 requestAnimationFrame(() => console.log("redraw"));
 console.log("sync end");
}, 1000);

您将在控制台中看到
sync,sync end,然后,重画

您是否意识到这违反了承诺/a+spec?如果这是您第一次深入研究JavaScript,我建议您使用本机对象,不要尝试围绕它们进行结束运行…因此,如果(foo){返回新承诺(resolve=>{resolve(foo)},您就不能执行
If(foo){return new promission(resolve=>{resolve(foo)})}其他{/*其他逻辑*/}
??对我来说,你真正的问题似乎是代码运行速度比屏幕更新/渲染速度快。“但是阻止我使用async/await。”-它不应该,
await
与任何thenable一起工作,即使是那些立即调用回调的。不,它并不“总是需要一个本地的承诺”。当然,
await
始终是异步的,它不会释放Zalgo。请发布您的实现代码以及您是如何使用它的。我写道我对其他解决方案持开放态度,但不,这不仅仅是关于屏幕更新,异步行为打破了onMouseEnter/onmouseeve行为。关于wait,TypeScript编译器说:“TS1064:异步函数或方法的返回类型必须是全局承诺类型。”我认为在我的例子中,React的虚拟DOM是在不知道承诺已经解决的情况下首先构建的,这在“then”导致React重新提交之前就在浏览器中结束了关于async/await,限制可能是由TypeScript引起的;我不知道这一点。