小编Sem*_*lon的帖子

检查构造函数是否在ES6中继承了另一个构造函数

我有一种情况需要检查构造函数(X)在其原型链中是否有另一个构造函数(Y)(或者是Y本身).

最快的方法可能是这样做(new X()) instanceof Y.在这种情况下,这不是一个选项,因为有问题的构造函数可能会在没有有效参数的情况下实例化.

我考虑的下一个方法是:

const doesInherit = (A, B) => {
  while (A) {
    if (A === B) return true;
    A = Object.getPrototypeOf(A);
  }

  return false;
}
Run Code Online (Sandbox Code Playgroud)

这是行得通的,但我无法摆脱这种感觉,即我错过了一些更简单的检查方法.有吗?

javascript prototypal-inheritance ecmascript-6

17
推荐指数
2
解决办法
7489
查看次数

在单个模块中覆盖node.js querystring.escape

我想在对象上使用querystring.stringify.字符串的要求略微偏离标准,星号,斜杠和撇号都需要转义.Querystring不会逃避这些(它们通常不需要)但是文档说querystring.escape是专门公开的,所以我们可以使用我们自己的函数覆盖它.以下内容对我有用:

querystring.escape = function(str) {
    str = encodeURIComponent(str)
        .replace(/\*/g, '%2A')
        .replace(/\(/g, '%28')
        .replace(/\)/g, '%29')
        .replace(/'/g, '%27');
    return str;
};
Run Code Online (Sandbox Code Playgroud)

我唯一担心的是,如果我理解正确,这可能会改变其他模块的行为,这些模块将来可能还需要查询字符串(具有正常的转义函数).node.js文档说,模块只加载一次,原始实例返回到后续的require调用.有没有办法让我强制这个特殊的查询字符串实例是唯一的?

显然我可以编写一个在传统调用querystring.stringify之后进行替换的包装器,但我很好奇,因为标准节点模块确实有一个"全局"设置对我来说似乎很奇怪,除非实际上有某种方式毕竟需要一个独特的实例.

javascript node.js

7
推荐指数
1
解决办法
2338
查看次数

Mongoose文档没有"保存"方法 - 但是,确实如此

迭代返回的一组文档时Model.find(),我将每个结果文档传递给另一个最终调用该save()方法的函数.但我得到这个错误:

[TypeError: Object #<Object> has no method 'save']
Run Code Online (Sandbox Code Playgroud)

我已经确认有问题的对象是Mongoose文档.事实上 - 这真让我感到困惑......

console.log(order.save); // { [Function] numAsyncPres: 0 }
order.save(); // [TypeError: Object #<Object> has no method 'save']
Run Code Online (Sandbox Code Playgroud)

我甚至不明白这是怎么可能的,因为它存在直到我称之为......

如果需要的话,我会提供更多的上下文代码,但是我正在指责这是一些已知的奇怪/愚蠢的疏忽,我可以立即认出.

编辑:在查看错误堆栈时,我看到它正在调用save.否则,我会看到完全不同的错误消息.相反,save方法无法找到内部保存方法.这是堆栈:

at C:\dev\node_modules\mongoose\lib\document.js:1272:13
at Array.forEach (native)
at model.pre.err.stack (C:\dev\node_modules\mongoose\lib\document.js:1254:12)
at model._next (C:\dev\node_modules\mongoose\node_modules\hooks\hooks.js:50:30)
at model.proto.(anonymous function) [as save] (C:\dev\node_modules\mongoose\node_modules\hooks\hooks.js:96:20)
at fixNoPriceItem (C:\dev\unimatrix\node_modules\cathy.js:202:10)
at Array.forEach (native)
at CallManager.callback (C:\dev\unimatrix\node_modules\cathy.js:181:18)
at Object.tracker.complete (C:\dev\unimatrix\node_modules\mowse\node_modules\constructors\Call-Manager.js:80:8)
at continueHandling (C:\dev\unimatrix\node_modules\mowse\node_modules\constructors\Call-Manager.js:138:14)
Run Code Online (Sandbox Code Playgroud)

实际调用的函数order.savefixNoPriceItem第六个函数.

保存前对文档的唯一更改如下:

order.items[targetIndex] = itemData; // items is …
Run Code Online (Sandbox Code Playgroud)

javascript mongoose mongodb node.js

5
推荐指数
0
解决办法
383
查看次数

具有多个操作的IndexedDB transaction.oncomplete

问题是:IDBTransaction是如何从IDBDatabase获得的,我们称之为A类 - 知道何时调用 oncomplete它是否可以包含任意数量的IDBTransaction(类型B)子节点?

首先,从数据库连接中获取'type A'IDBTransaction:

const transA = IDBDatabase.transaction(storeName, mode);
Run Code Online (Sandbox Code Playgroud)

这个IDBT可以携带该oncomplete事件,并且据推测它将在交易完成时触发.但是您使用此IDBT通过一个或多个检索到的IDBObjectStores"启动"实际事务:

const store = transA.objectStore(storeName);
const transB1 = store.delete(key);
const transB2 = store.add(item);
Run Code Online (Sandbox Code Playgroud)

现在,transB1transB2也IDBTransaction的情况下,可以有自己的oncomplete处理程序.根据我的理解,这里的父事务的想法是它允许聚合事务是原子的; 如果transB1成功但transB2失败,则回滚transB1.好.因此,我们通常更倾向于倾听父母,而不是孩子,因为这是告诉我们它是否真的成功的原因.

我不明白美中不足的是:没有closedonefinish方法或什么的.那么如何transA知道何时触发oncomplete呢?

我现在能想到的是,它希望在一次打勾期间创建所有子事务.那是怎么回事?(已经非常明显的是,IndexedDB非常痛苦,但是悄悄地依赖同步意味着这样的行为似乎是一个边界,即使是DOM霸主也不会跨越.)真正发生了什么?

javascript indexeddb

5
推荐指数
1
解决办法
712
查看次数

HTTP2推送和本机ES模块:“进入”模块推送被忽略

我一直在尝试通过HTTP2服务本机ES模块的方法。几乎所有东西都运行良好(在支持的情况下),但是有一个我不太理解的怪癖。

给定一个对/文档的请求,我推送直接或间接被认为是该文档依赖项的资源。在这种情况下,最终是通过推送搭载的三个其他资源:

  • /index.css(通过的依赖项<link href ...>
  • /index.js(通过 <script type="module" src ...>
  • /routes.js(间接依赖项,由导入index.js

所有这三个资源似乎都已从服务器端成功推送。但是,尽管第一个请求被推送,Chrome仍对“ /index.js”提出了第二个请求。其他两个资源均未请求;这些推送的响应似乎被正确确认。

起初,我认为这是Chrome的古怪之处,只是新创建功能的粗略边缘。但是,当启用模块支持标志时,在Firefox中也演示了相同的行为,这使我想知道这是否出于某些原因是故意的。

网络活动

从与上述请求相对应的后端记录:

RECEIVED REQUEST: GET /
...PUSHING /index.css
...PUSHING /index.js
...PUSHING /routes.js
RECEIVED REQUEST: GET /index.js
...PUSHING /routes.js
Run Code Online (Sandbox Code Playgroud)

遵循@sbordet的指示:这是两个请求的记录(很高兴知道这些内容可以在Chrome中自省!):

第一要求(/)

3067: HTTP2_SESSION
death.tips:443 (DIRECT)
Start Time: 2017-10-09 10:49:24.597

t=304289 [st= 0] +HTTP2_SESSION  [dt=?]
                  --> host = "death.tips:443"
                  --> proxy = "DIRECT"
t=304289 [st= 0]    HTTP2_SESSION_INITIALIZED
                    --> protocol = "h2"
                    --> source_dependency = 3064 (SOCKET)
t=304289 [st= 0]    HTTP2_SESSION_SEND_SETTINGS
                    --> settings = ["[id:1 (SETTINGS_HEADER_TABLE_SIZE) …
Run Code Online (Sandbox Code Playgroud)

http2 es6-modules

5
推荐指数
1
解决办法
317
查看次数

parseInt和javascript中的负零:奇怪的行为?

为什么:

parseInt(-0, 10) // 0
parseInt('-0', 10) // -0
Run Code Online (Sandbox Code Playgroud)

是否有一个明智的理由,parseInt不会为两者做-0或这只是一个奇怪的JavaScript?

javascript zero parseint

3
推荐指数
1
解决办法
458
查看次数