我正在开发的单页应用程序中广泛使用JavaScript Promise。在某些情况下,如果承诺已经解决,则需要“ then”方法同步运行。为此,我编写了一个自定义的Promise实现作为包装器类,它可以正常工作,但会阻止我使用async / await。因此,我想知道是否可以同时使用这两种方法,因为在我看来,async / await实际上只是“ then”周围的语法糖。
自定义诺言实现已经实现了PromiseLike
TypeScript接口,但是显然异步/等待总是需要一个本机诺言。为什么?
我想到的一种可能性是替换真正的Promise对象的“ then”方法,而不是在顶部构建自己的包装器。这样行吗?
立即调用“ then”很重要的原因是promise链的末尾是React组件的属性,并且React组件显示一个加载指示器,直到promise被解决。没有我的包装,每次组件更新时都会短暂显示加载指示符,这也会中断一些用户交互。
也许有另一种方法可以解决此问题。这是我第一次深入JavaScript领域。
我正在使用TypeScript并定位到ES6。
答案 0 :(得分:2)
但是显然异步/等待总是需要一个本地的诺言。
不,不是。 await
对具有.then
方法的对象起作用。
没有我的包装,每次组件更新时都会短暂显示加载指示符,这也会中断一些用户交互。
这不是由于等待已解决的诺言引起的。 .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, then, redraw
。