Return 在 "Promise.then()" 中具有 "then" 函数的对象

Return an object with a "then" function within "Promise.then()"

在我的 Node.JS 应用程序中,我编写了一个函数 (findByReference),它转到数据库并异步生成获取的数据库行。我使用 Promises 编写了这个函数。此外,我已经编写了 Maybe monad 的实现,并希望我的 findByReference 函数生成 Maybe.

的实例

我的代码如下所示:

findByReference(r)
  .then(raw => raw ? Just(raw) : Nothing())
  .then(row => {
    (row instanceof Maybe) === true;
  });

先不说 JustNothing 的意思,这意味着(因为我写 Maybe 的方式)是 row 变量在上面的代码 有一个函数叫做 "then"。长话短说, Javascript 似乎变得困惑,并且出于某种原因自动调用 MY "then" 而不是传递 Maybe 实际上是传递给回调无论 MY "then" returns 作为 row 的值。这显然会导致各种奇怪的行为。如果我只是从我的对象中删除 "then" 函数,那么它就会按预期工作。

我知道如果 Promise.then returns 另一个 Promise,那么执行将暂停,直到该 Promise 得到解决。我一直找不到任何官方文档来支持这一点,但这个决定是否只是基于 "then" 函数的存在(我找到的最接近的是这个 https://developers.google.com/web/fundamentals/primers/promises which refers to the return value as "something Promise-like"). If this is the case, it would be my understanding that "then" as a function name is basically a reserved word in Javascript? I have seen other implementations of Maybe (such as this one https://www.npmjs.com/package/data.maybe)将 "chain" 这个词用于类似的事情 - 我想知道这是否是原因?

如果我在这里的推论是正确的,谁能解释一下,如果是的话,除了重命名我的函数之外,还有什么解决方法可以使用吗?

仅供参考,我发现唯一涉及此问题的其他 SO 问题是这个问题 - Resolve promise with an object with a "then" function - 但由于这是 angular-specific,我不认为这是重复。

提前致谢!

...the row variable in the above code has a function on it called "then". To cut a long story short, it appears that Javascript is getting confused and is for some reason automatically calling MY "then"...

不糊涂。 :-) 这是承诺如何工作的定义。 JavaScript 的承诺根据 Promises/A+ specification 工作,它使用了这个术语:

1.1 “promise” is an object or function with a then method whose behavior conforms to this specification.

1.2 “thenable” is an object or function that defines a then method.

如果您有一个对象通过一个 thenable 但不是 promise 的 promise 链,则它与 promise 不兼容。

所以是的,在某种意义上,then 属性 对象通过承诺链是 "reserved" Promises/A+ 规范。您需要将 raw 值包装在一个没有 then 的对象中(稍后再打开)。或者,如果可以,请在您的设计中重命名 then 以消除冲突。