挂起的回调:在每次回调返回之前返回响应

Dangling callbacks: return response before every callback has returned

本文关键字:返回 回调 响应 挂起      更新时间:2024-01-10

问题:您是否认为悬挂回调是糟糕的node.js风格,甚至是危险的?如果是,在哪个前提下?

案例:如下所述,假设您需要调用express服务器中的数据库来更新一些数据。然而,客户不需要被告知结果。在这种情况下,您可以立即返回响应,而不是等待异步调用完成。由于缺少更好的名称,这将被描述为悬挂回调

为什么这很有趣?:因为教程和文档在大多数情况下显示了等待的情况,在最坏的情况下教回调地狱。回想一下你第一次使用say express、mongodb和passport的经历。


示例:

'use strict'
const assert = require('assert')
const express = require('express')
const app = express()
function longOperation (value, cb) {
  // might fail and: return cb(err) ...here
  setTimeout(() => {
    // after some time invokes the callback
    return cb(null, value)
  }, 4000)
}
app.get('/ping', function (req, res) {
  // do some declartions here
  //
  // do some request processesing here
  // call a long op, such as a DB call here.
  // however the client does not need to be
  // informed about the result of the operation
  longOperation(1, (err, val) => {
    assert(!err)
    assert(val === 1)
    console.log('...fired callback here though')
    return
  })
  console.log('sending response here...')
  return res.send('Hello!')
})
let server = app.listen(3000, function () {
  console.log('Starting test:')
})

是的,这基本上就是其他上下文中所谓的"fire-and-forget"服务,也是实现命令-查询-响应分离的良好设计的第一步。

我不认为这是一个"悬空回调",在这种情况下,响应会确认收到了请求。在这里,你最好的选择是确保你的响应包括某种超媒体,让客户端稍后获得他们请求的状态,如果这是一个错误,他们可以修复,让新资源URL上的内容告诉他们如何修复。

在用户注册工作流的情况下,用户必须得到管理员的批准,或者在获得访问权限之前必须确认他们的电子邮件。