".then(function(a){ return a; })" 是 Promise 的空操作吗?

IT技术 javascript node.js promise bluebird
2021-01-28 21:58:06

我正在阅读有关 Bookshelf 的教程Bookshelf 使用 Bluebird Promise。有很多例子看起来像这样:

var getEvents = function(participantId) {  
  return new models.Participant()
    .query({where: {id: participantId}})
    .fetch({withRelated: ['events'], require: true})
    .then(function(model) {
      return model;
    });
};

我仍然对 Promise 感到不舒服,但从我目前学到的东西来看,这似乎很奇怪。我的问题是,上述函数是否与fetch()直接返回并离开 final完全相同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; }),一般来说只是一个空操作。对?

如果它们不一样,那有什么区别?这是怎么回事,为什么作者要这样写?

2个回答

在我看来,这.then(function (a) { return a; })只是一个空操作。对?

是的。1

它是无用的,应该省略。

这是怎么回事,为什么作者要这样写?

这是一个错误。或者作者不理解Promise。

1:如果不一样,有什么区别?

与往常一样,有一些边缘情况。真是奇怪的人。没有人应该使用(没有大量评论):
a)它返回一个新的Promise实例,一个不同的对象,以避免共享。不过,.then()也会。
b)a再次测试其当时的可行性。要是兑现后突然变成了Promise,现在就等着吧。这当然会很糟糕。

“b”案例听起来很可怕。
2021-04-08 21:58:06

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>}而不是记录对象,下一步也一样
2021-03-31 21:58:06
我已经看到这实际上发生在设计非常糟糕的代码中。我不会轻易忘记的。
2021-04-07 21:58:06