了解和使用 JavaScript 中的回调函数

发布于 2022-08-08 12:41:08 字数 2863 浏览 220 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

yili302

文章 0 评论 0

晚霞

文章 0 评论 0

LLFFCC

文章 0 评论 0

陌路黄昏

文章 0 评论 0

xiaohuihui

文章 0 评论 0

你与昨日

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文