挂起的回调:在每次回调返回之前返回响应
Dangling callbacks: return response before every callback has returned
问题:您是否认为悬挂回调是糟糕的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上的内容告诉他们如何修复。
在用户注册工作流的情况下,用户必须得到管理员的批准,或者在获得访问权限之前必须确认他们的电子邮件。
相关文章:
- 函数表达式,返回回调函数
- 如何“;等待”;以便返回回调
- jQuery,动画和动画返回.回调函数错误?:S
- 节点.js AMQP 不返回回调
- 返回回调函数 Node.js 的数据
- 承诺不返回回调数组
- 使用 jsonp 和 php 返回回调
- 订阅子作用域上的事件,并在broadcastemit中返回回调
- 为什么angular返回回调函数内部的函数
- Node.js:为什么要在错误处理期间返回回调的结果
- 如何构造代码以返回回调
- 具有HTTP请求的Meteor方法不返回回调
- 我如何返回回调MySQL查询和推到一个数组在Node.js
- 如何从使用node-oracledb的查询返回回调
- 直接调用回调或返回回调
- 设置变量返回回调监听器
- 泛型池函数返回回调的结果
- 回调中的AWS返回回调
- 我应该返回回调还是直接运行它
- 节点HTTPS请求没有在Lambda中返回回调函数