悬挂callback:在每个callback已经返回之前返回响应

问题:你认为悬挂callback是不好的node.js风格,甚至是危险的吗? 如果是这样的前提下呢?

案例:如下所述,假设您需要在更新某些数据的快速服务器上调用数据库。 然而,客户不需要被告知结果。 在这种情况下,您可以立即返回响应, 而不是等待asynchronous调用完成。 这将被描述为没有更好的名字的悬挂callback

为什么这很有趣?:因为在大多数情况下教程和文档都显示等待的情况,在最糟糕的情况下教导callback地狱。 回想一下你说的快递,蒙古包和护照的第一次经历。


例:

'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:') }) 

是的,在其他情况下,这基本上就是所谓的“火灾和遗忘”服务,也可能是实现命令查询响应分离的良好devise的第一步。

我不认为这是一个“摇摆的callback”,在这种情况下的答复承认,请求已收到。 这里最好的办法是确保你的响应包含某种超媒体,让客户以后可以得到请求的状态,如果这是一个错误,他们可以修改新资源URL的内容告诉他们如何。

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