在 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; }); };
但是,此代码对那些人提出了问题不熟悉承诺。 then 函数对代码的整体行为有任何有意义的影响吗?如果没有它,下面的实现能否达到相同的结果?
var getEvents = function(participantId) { return new models.Participant() .query({where: {id: participantId}}) .fetch({withRelated: ['events'], require: true}); };
问题的关键在于传递给then的函数参数。该参数预计会收到链中前一个 Promise 的返回值。因此,看来 return a; then 函数中的语句本质上是一个无操作,因为它只是不改变地传递接收到的参数。
尽管它有明显的冗余,但 then 函数还是有用的某些用例中的目的。一个例子是,当返回的 Promise 需要在整个链中进行不同的处理时。例如,它可以被记录、转换为 JSON 或以自定义方式处理。另一个优点是 then 函数允许错误处理,尽管这也可以通过 did 来实现,具体取决于所使用的 Promise 库。
一般来说,建议只当真正需要时再使用。不必要的 then 函数会给代码库增加不必要的复杂性并增加出错的可能性。作为一般经验法则,仅当返回的 Promise 的结果或错误需要显式修改或处理时才合并 then。
以上是“.then(function(a){ return a; })”实际上为 Promise 做任何事情吗?的详细内容。更多信息请关注PHP中文网其他相关文章!