- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在玩Promise Extensions for JavaScript (prex)我想扩展标准Promise class使用 prex.CancellationToken 取消支持, complete code here .
出乎意料的是,我看到了我的自定义类的构造函数 CancellablePromise
被调用两次。为了简化事情,我现在剥离了所有取消逻辑,只留下了重现问题所需的最低限度:
class CancellablePromise extends Promise {
constructor(executor) {
console.log("CancellablePromise::constructor");
super(executor);
}
}
function delayWithCancellation(timeoutMs, token) {
// TODO: we've stripped all cancellation logic for now
console.log("delayWithCancellation");
return new CancellablePromise(resolve => {
setTimeout(resolve, timeoutMs);
}, token);
}
async function main() {
await delayWithCancellation(2000, null);
console.log("successfully delayed.");
}
main().catch(e => console.log(e));
node simple-test.js
运行它,我得到这个:
CancellablePromise::constructor
?
runMicrotasks
调用的。 ,它本身是从
_tickCallback
调用的Node.js 内部的某个地方。
static get [Symbol.species]() { return Promise; }
到
CancellablePromise
类(class)
solves the problem .
最佳答案
第一次更新:
我首先想到.catch( callback)
在 'main' 之后将返回扩展 Promise 类的新的未决 promise ,但这是不正确的 - 调用异步函数返回 Promise
promise 。
进一步削减代码,只产生一个未决的 promise :
class CancellablePromise extends Promise {
constructor(executor) {
console.log("CancellablePromise::constructor");
super(executor);
}
}
async function test() {
await new CancellablePromise( ()=>null);
}
test();
await
来电
Promise.resolve
在它的操作数上。 (编辑:或者它可能在早期 JS 引擎的 async/await 版本中没有严格执行标准)
Promise.resolve
返回操作数不变。
Promise
,
Promise.resolve
使用 onfulfilled 和 onRejected 处理程序调用操作数的 then 方法,以便通知操作数的已解决状态。此调用创建并返回的 promise
then
属于扩展类,并解释了对 CancelablePromise.prototype.constructor 的第二次调用。
new CancellablePromise().constructor
是 CancellablePromise
class CancellablePromise extends Promise {
constructor(executor) {
super(executor);
}
}
console.log ( new CancellablePromise( ()=>null).constructor.name);
CancellablePromise.prototype.constructor
至Promise
出于测试目的,只导致一次调用 CancellablePromise
(因为 await
被欺骗返回其操作数):class CancellablePromise extends Promise {
constructor(executor) {
console.log("CancellablePromise::constructor");
super(executor);
}
}
CancellablePromise.prototype.constructor = Promise; // TESTING ONLY
async function test() {
await new CancellablePromise( ()=>null);
}
test();
await
specification
await
创建一个匿名的中间
promise 使用 onFulilled 和 onRejected 处理程序 promise
await
之后恢复执行运算符或从中抛出错误,具体取决于中间 promise 达到的稳定状态。
await
) 也调用
then
在操作数上 promise 履行或拒绝中间 promise 。这个特殊的
then
调用返回类
operandPromise.constructor
的 promise .虽然
then
从不使用返回的 promise ,在扩展类构造函数中记录会显示调用。
constructor
扩展 promise 的值改回
Promise
出于实验目的,以上
then
call 将默默地返回一个 Promise 类 promise 。
await
specification
Let asyncContext be the running execution context.
Let promiseCapability be ! NewPromiseCapability(%Promise%).
promise
创建一个新的类似 jQuery 的延迟对象,
resolve
和
reject
属性,而是将其称为“PromiseCapability Record”。延期的
promise
对象是(全局)基
promise 构造函数类。
- Perform ! Call(promiseCapability.[[Resolve]], undefined, « promise »).
await
的右操作数解决延迟 promise .解析过程调用
then
如果操作数是“thenable”,则操作数的方法,或者如果操作数是其他一些非 promise 值,则满足延迟 promise 。
Let stepsFulfilled be the algorithm steps defined in Await Fulfilled Functions.
Let onFulfilled be CreateBuiltinFunction(stepsFulfilled, « [[AsyncContext]] »).
Set onFulfilled.[[AsyncContext]] to asyncContext.
await
操作,在
async
里面通过返回作为参数传递给处理程序的操作数的已实现值来调用它的函数。
Let stepsRejected be the algorithm steps defined in Await Rejected Functions.
Let onRejected be CreateBuiltinFunction(stepsRejected, « [[AsyncContext]] »).
Set onRejected.[[AsyncContext]] to asyncContext.
await
操作,在
async
里面它被调用的函数,通过抛出一个作为参数传递给处理程序的 promise 拒绝原因。
- Perform ! PerformPromiseThen(promiseCapability.[[Promise]], onFulfilled, onRejected).
then
关于这两个处理程序的延迟 promise ,以便
await
可以响应其操作数被结算。
then
已在内部调用,并且不会从调用中创建或返回 promise 。因此,延迟的结算将调度调用其结算处理程序之一到 promise 作业队列执行,但没有额外的副作用。
Remove asyncContext from the execution context stack and restore the execution context that is at the top of the execution context stack as the running execution context.
Set the code evaluation state of asyncContext such that when evaluation is resumed with a Completion completion, the following steps of the algorithm that invoked Await will be performed, with completion available.
await
并返回到事件循环或微任务队列管理器。
关于javascript - 自定义 Promise 类的构造函数被调用两次(扩展标准 Promise),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53146565/
我是 magento 的新手,目前我在 magento 安装期间遇到“必须加载 PHP 扩展 curl ”错误。你能帮帮我吗? 最佳答案 如果您的服务器上没有安装 curl,您可以键入以下命令之一来安
我在 macOS Mojave/macOS Big Sur/macOS Monterey/macOS Ventura 上使用最新的 php 版本 7.2 并收到类似错误 $composer requ
这个问题已经有答案了: Why generic type is not applicable for argument extends super class for both? (5 个回答) 已关
我正在使用 NightWatch.js 并进行一些 UI 测试,我想用一些额外的 desiredCapabilities 启动默认浏览器实例(即启用扩展并应用一些特定值)。 p> 注意:我可以执行这些
有人知道为什么我在 java 8 中使用此代码时没有服务器扩展名称吗: try { URL url = new URL(urlString); URLC
扩展提供给我的类(class)。为现有的类提供新功能。或扩展现有的mixin s 或虚拟类,任何东西都可以工作。 也许是这样的: class FlatButton {} // maybe no
我有一个关于使用 c 代码和 mod_wsgi 扩展 python 的问题。 我在 apache 服务器中有一个 django 应用程序,它查询 postgresql 数据库以生成报告。在某些报告中,
testcafe支持在Chrome浏览器中加载crx扩展吗? 如果是这样,请告诉我需要尝试什么方法。 我尝试了下面的代码,但没有成功 await t.eval(new Function(fs.read
这个问题已经有答案了: What is a raw type and why shouldn't we use it? (16 个回答) 已关闭 3 年前。 有什么区别: // 1 class A c
我正在编写一个 chrome 扩展来记录单击开始按钮后触发的请求。 这是我的文件:1. list .json { "manifest_version": 2, "name": "recorde
我每天都在使用 vim 和 perforce 现在我的问题是,如果我想查看 perforce 文件修订版,则从命令模式下的 vim :!p4 打印文件#1 vim 试图让我获得缓冲区 #1。有没有办法
大家好,我有一个关于 NUnit 扩展(2.5.10)的问题。 我想做的是向 数据库。为此,我使用 Event 创建了 NUnit 扩展 听众。 我遇到的问题是公共(public)无效 TestFin
我有弹出窗口,而不是模态窗口。 如何通过单击页面的其他部分(不在窗口中)来关闭此窗口? 最佳答案 像这样的东西: function closeWin(e, t) { var el = win.
我通常非常谨慎地使用扩展方法。当我确实觉得有必要编写一个扩展方法时,有时我想重载该方法。我的问题是,您对调用其他扩展方法的扩展方法有何看法?不好的做法?感觉不对,但我无法真正定义原因。 例如,第二个
扩展 Ant Ant带有一组预定义的任务,但是你可以创建自己的任务,如下面的例子所示。 定制Ant 任务应扩展 org.apache.tools.ant.Task 类,同时也应该拓展 execut
我想要一个重定向所有请求的扩展: http://website.com/foo.js 到: http://localhost/myfoo.js 我无法使用主机文件将主机从 website.com 编辑
对于为什么 QChartView 放在 QTabWidget 中时会扩展,我有点迷惑。 这是 QChartView 未展开(因为它被隐藏)时应用程序的图片。 应用程序的黑色部分是 QOpenGLWid
如果在连接条件中使用 OR 运算符,如何优化以下查询以避免 SQL 调优方面的 OR 扩展? SELECT t1.A, t2.B, t1.C, t1.D, t2.E FROM t1 LEFT J
一旦加载插件的问题得到解决(在 .NET 中通过 MEF 的情况下),下一步要解决的是与它们的通信。简单的方法是实现一个接口(interface),使用插件实现,但有时插件只需要扩展应用程序的工作方式
在我的 Symfony2 包中,我需要检查是否定义了一个函数(一个扩展)。更具体地说,如果安装了 KnpMenuBundle,我会在我的包中使用那个,否则我将自己渲染插件。 我试过了,但这当然不起作用
我是一名优秀的程序员,十分优秀!