在我的Node.JS应用程序中,我编写了一个函数(findByReference
),该函数转到数据库并异步产生已提取的数据库行。我已经使用Promises编写了此功能。另外,我已经编写了Maybe
monad的实现,并希望我的findByReference
函数产生Maybe
的实例。
我的代码如下所示:
findByReference(r)
.then(raw => raw ? Just(raw) : Nothing())
.then(row => {
(row instanceof Maybe) === true;
});
无需深入研究Just
和Nothing
的含义,其含义(因为我写了Maybe
的原因)是上面的row
变量代码上具有一个名为“然后”的功能。简而言之,似乎Javascript变得混乱,由于某种原因,它会自动调用MY“ then”,而不是通过Maybe
实际上是将MY“ then”作为值返回的任何内容传递给回调函数row
中的。显然,这导致了各种奇怪的行为。如果我只是从对象中删除“ then”功能,那么所有功能都将按预期工作。
我知道,如果Promise.then
返回另一个Promise,那么执行将暂停,直到该Promise被解决为止。我一直找不到任何官方文档来支持此操作,但是是否此决定仅基于“ then”函数的存在(我发现的最接近的是这个https://developers.google.com/web/fundamentals/primers/promises返回值为“类似Promise的东西”)。如果是这样,我的理解是“ then”作为函数名称基本上是Javascript中的保留字吗?我看到过Maybe的其他实现(例如,这个https://www.npmjs.com/package/data.maybe),在类似的事情上使用了“链”一词-我想知道这是为什么吗?
如果我的推论是正确的,是否有人可以澄清,是否可以重命名我的功能以外的其他解决方法?
仅供参考,我发现与这个问题相关的唯一一个SO问题-Resolve promise with an object with a "then" function-但由于这是特定于角度的,因此我不认为这是重复的。
谢谢!
答案 0 :(得分:3)
...上面代码中的row变量具有一个称为“ then”的函数。简而言之,似乎Javascript变得混乱,由于某种原因,它会自动将MY称为“ then” ...
这并不困惑。 :-)这是承诺如何工作的定义。 JavaScript的诺言根据Promises/A+ specification使用以下术语进行工作:
1.1“承诺”是具有
then
方法的对象或函数,其行为符合此规范。1.2“ thenable”是定义
then
方法的对象或函数。
如果您的对象通过的承诺链是 thenable 而不是 promise ,则它与promise不兼容。
所以是的,从某种意义上说,Promises / A +规范“保留”了通过承诺链的对象的then
属性。您需要将raw
值包装在没有then
的对象中(然后在以后将其解包)。或者,如果可以的话,请在设计中重命名then
以消除冲突。