Javascript承诺会立即调用“然后”

时间:2019-02-21 17:31:30

标签: javascript promise

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

自定义诺言实现已经实现了PromiseLike TypeScript接口,但是显然异步/等待总是需要一个本机诺言。为什么?

我想到的一种可能性是替换真正的Promise对象的“ then”方法,而不是在顶部构建自己的包装器。这样行吗?

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

也许有另一种方法可以解决此问题。这是我第一次深入JavaScript领域。

我正在使用TypeScript并定位到ES6。

1 个答案:

答案 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