了解和使用 JavaScript 中的回调函数
JavaScript 中的一个常见模式是将内联函数作为参数传递给另一个函数。 例如:
[1, 2, 3].forEach(function callback(v) {
console.log(v); // 1, 2, 3
});
fetch('https://google.com').then(function callback(res) {
console.log(res);
});
new EventEmitter().on('event', function callback(ev) {
console.log(ev);
});
在最一般的意义上,JavaScript 中的 回调 是一个由其他人为你调用的函数。 其他人可能是一个内置的 JavaScript 函数,例如 setTimeout()
、Express 之类的框架、Axios 之类的库或任何其他 JavaScript 代码。 回调是 反应 相反, 命令式 :您定义了一个应该由另一段代码调用的函数,但您不负责调用该函数。
// The JavaScript runtime is responsible for calling `callback`
// in 5 seconds
setTimeout(function callback() {
console.log('Hello, World!');
}, 5000);
const app = require('express')();
// Express is responsible for calling `callback` with the
// correct parameters
app.get('/', function callback(req, res) {
res.send('Hello, World!');
});
Node-style 回调
Promise 是 JavaScript 的一个相对较新的补充,它们于 2015 年首次添加。在 Promise 和 async/await 之前,Node.js 中异步操作的实际范例是传递一个带有 2 个参数的回调函数,一个错误 err
结果 res
. 当有人谈论 回调地狱 时,他们通常指的是使用 Node 风格的回调。
例如, Amazon AWS 的 S3 的 Node.js SDK 目前只支持回调。 为了让 AWS 开发工具包在您的文件上传完成时通知您,您需要传递一个回调函数。
const AWS = require('aws-sdk');
const fs = require('fs');
AWS.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});
const s3 = new AWS.S3();
const options = {
Bucket: process.env.AWS_BUCKET,
Body: fs.createReadStream('./package.json'),
Key: 'package.json'
};
// Pass a `callback` that takes 2 params: `err` and `res`. If `err` is
// null or undefined, you can assume the upload succeeded.
s3.upload(options, function callback(err, res) {
if (err != null) {
// If `err` is set, you should handle the error
}
});
Node 样式回调的主要目的是告诉您异步操作是成功还是失败,如果成功,结果是什么。
为此,Promise 在很大程度上取代了 Node 风格的回调,因为嵌套回调在语法上很痛苦,而且因为 Node 风格的回调从未标准化。
对 Promise 的回调
Node.js 有一个内置的 promisify()
。 将基于回调的 API 转换为返回 Promise 的函数的函数 这是您可以使用的方法 promisify()
将基于节点回调的函数转换为返回承诺的函数:
function myCallbackBasedFunction(callback) {
setTimeout(() => callback(null, 'Hello, World!'), 25);
}
const util = require('util');
const myPromiseBasedFunction =
util.promisify(myCallbackBasedFunction);
await myPromiseBasedFunction(); // 'Hello, World!'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论