“.then(function(a) return a; )” 是 promise 的 no-op 吗?
Posted
技术标签:
【中文标题】“.then(function(a) return a; )” 是 promise 的 no-op 吗?【英文标题】:Is ".then(function(a) return a; )" a no-op for promises?“.then(function(a) return a; )” 是 promise 的 no-op 吗? 【发布时间】:2017-04-26 15:02:10 【问题描述】:我正在阅读this tutorial about Bookshelf。 Bookshelf 使用 Bluebird 承诺。有很多类似这样的例子:
var getEvents = function(participantId)
return new models.Participant()
.query(where: id: participantId)
.fetch(withRelated: ['events'], require: true)
.then(function(model)
return model;
);
;
我仍然对 Promise 感到不舒服,但从我目前所了解到的情况来看,这似乎很奇怪。我的问题是,上述函数是否与直接返回fetch()
并省略最终的then()
完全相同:
var getEvents = function(participantId)
return new models.Participant()
.query(where: id: participantId)
.fetch(withRelated: ['events'], require: true);
;
也就是说,它仍然做同样的事情,返回同样的promise,可以用同样的方式调用等等?
据我了解,传递给then
的函数的参数获取的是链中前一个promise的返回值。所以,在我看来,.then(function (a) return a; )
通常只是一个空操作。对吧?
如果它们不一样,有什么区别?这是怎么回事,为什么作者要这样写?
【问题讨论】:
.then(function(model) return model; );
没用,可以(并且应该)被删除。
如果fetch
处理程序可以提供一些参数,这是有意义的。在此之后 - 承诺将只解决一个。
作者最后添加了then
,以表明在此步骤中您可以操作model
额外.then()
的一个常见原因是您可以在那里记录结果或在其上设置断点以检查它。这可能应该在一般发布之前被删除,但这有时就是它存在的原因。或者,作者认为他们可能想要在返回结果之前稍微处理一下结果,然后最终没有这样做。或者这只是为了教育目的,以更好地说明返回结果。
【参考方案1】:
在我看来,
.then(function (a) return a; )
只是一个空操作。对吧?
是的。1
无用,应省略。
这是怎么回事,为什么作者要这样写?
这是一个错误。或者作者不理解promise。
1:如果不一样,有什么区别?
与往常一样,存在一些极端情况。真的很奇怪。没有人应该使用(没有大量评论):
a) 它返回一个新的 Promise 实例,一个不同的对象,以避免共享。但是,.then()
也可以。
b) 再次测试a
的thenable-ness。如果它在实现之后突然变成了一个承诺,那么现在将等待它。这当然会很糟糕。
【讨论】:
“b”案听起来很可怕。【参考方案2】:Bergi 的回答是正确的,但只是为了证明它不是无操作的情况,这里是一个人为的例子,它不是无操作:
o = ;
Promise.resolve(o).then(o => o.then = () => ); // make thenable
Promise.resolve(o).then(console.log); // logs the object
Promise.resolve(o).then(x => x).then(console.log); // doesn't log the object
一般不要then(function(a) return a; )
【讨论】:
我曾在设计不佳的代码中看到过这种情况。我不会轻易忘记的。 我尝试了确切的步骤,Promise.resolve(o).then(console.log);
返回Promise <pending>
而不是记录对象,下一步也是如此以上是关于“.then(function(a) return a; )” 是 promise 的 no-op 吗?的主要内容,如果未能解决你的问题,请参考以下文章