在“ Promise.then()”中返回带有“ then”功能的对象

时间:2018-12-28 13:15:41

标签: javascript node.js promise monads maybe

在我的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变量代码上具有一个名为“然后”的功能。简而言之,似乎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-但由于这是特定于角度的,因此我不认为这是重复的。

谢谢!

1 个答案:

答案 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以消除冲突。