nodeJs 回调简单示例
nodeJs callbacks simple example
谁能给我一个简单的nodeJs回调的例子,我已经在很多网站上搜索过了,但无法正确理解,请给我一个简单的例子。
getDbFiles(store, function(files){
getCdnFiles(store, function(files){
})
})
我想做这样的事情...
var myCallback = function(data) {
console.log('got data: '+data);
};
var usingItNow = function(callback) {
callback('get it?');
};
现在打开节点或浏览器控制台并粘贴上述定义。
最后在下一行使用它:
usingItNow(myCallback);
关于节点样式错误约定
Costa问如果我们遵守节点错误回调约定,这会是什么样子。
在此约定中,回调应期望接收至少一个参数(第一个参数)作为错误。(可选)我们将有一个或多个附加参数,具体取决于上下文。在这种情况下,上下文就是我们上面的例子。
在这里,我在这个约定中重写了我们的例子。
var myCallback = function(err, data) {
if (err) throw err; // Check for the error and throw if it exists.
console.log('got data: '+data); // Otherwise proceed as usual.
};
var usingItNow = function(callback) {
callback(null, 'get it?'); // I dont want to throw an error, so I pass null for the error argument
};
如果我们想模拟一个错误案例,我们可以像这样定义 usingItNow
var usingItNow = function(callback) {
var myError = new Error('My custom error!');
callback(myError, 'get it?'); // I send my error as the first argument.
};
最终用法与上面完全相同:
usingItNow(myCallback);
行为上的唯一区别取决于您定义的usingItNow
版本:将"真实值"(Error 对象)提供给第一个参数的回调的那个,或者为错误参数提供 null 的版本。
回调函数只是您传递给另一个函数的函数,以便该函数可以在以后调用它。这在异步 API 中很常见;API 调用会立即返回,因为它是异步的,因此您将一个函数传递到其中,API 可以在完成执行其异步任务时调用该函数。
我在 JavaScript 中能想到的最简单的例子是 setTimeout()
函数。它是一个接受两个参数的全局函数。第一个参数是回调函数,第二个参数是以毫秒为单位的延迟。该函数旨在等待适当的时间,然后调用回调函数。
setTimeout(function () {
console.log("10 seconds later...");
}, 10000);
您可能以前看过上面的代码,但只是没有意识到您传入的函数称为回调函数。我们可以重写上面的代码以使其更加明显。
var callback = function () {
console.log("10 seconds later...");
};
setTimeout(callback, 10000);
回调在 Node 中随处可见,因为 Node 是从头开始构建的,在它所做的一切中都是异步的。即使在与文件系统通信时也是如此。这就是为什么大量的内部 Node API 接受回调函数作为参数,而不是返回可以分配给变量的数据。相反,它将调用您的回调函数,将您想要的数据作为参数传递。例如,您可以使用 Node 的fs
库来读取文件。fs
模块公开了两个独特的 API 函数:readFile
和 readFileSync
。
readFile
函数是异步的,而readFileSync
显然不是。您可以看到他们打算尽可能使用异步调用,因为他们称它们为readFile
和readFileSync
而不是readFile
和readFileAsync
。下面是使用这两个函数的示例。
同步:
var data = fs.readFileSync('test.txt');
console.log(data);
上面的代码阻止线程执行,直到test.txt
的所有内容都读入内存并存储在变量 data
中。在节点中,这通常被认为是不好的做法。但有时它很有用,例如在编写一个快速的小脚本来做一些简单但乏味的事情时,你不太关心尽可能节省每一纳秒的时间。
异步(带回调):
var callback = function (err, data) {
if (err) return console.error(err);
console.log(data);
};
fs.readFile('test.txt', callback);
首先,我们创建一个接受两个参数的回调函数 err
和 data
。异步函数的一个问题是捕获错误变得更加困难,因此许多回调样式的 API 将错误作为第一个参数传递给回调函数。最佳做法是在执行任何其他操作之前检查err
是否具有值。如果是这样,请停止执行回调并记录错误。
当存在引发异常时,同步调用具有优势,因为您只需使用 try/catch
块捕获它们即可。
try {
var data = fs.readFileSync('test.txt');
console.log(data);
} catch (err) {
console.error(err);
}
在异步函数中,它不是这样工作的。API 调用会立即返回,因此try/catch
没有任何内容可捕获。使用回调的正确异步 API 将始终捕获自己的错误,然后将这些错误传递到回调中,您可以在其中根据需要处理它。
除了回调之外,还有另一种流行的 API 样式,通常称为 promise。如果你想阅读它们,那么你可以阅读我基于这个答案写的整个博客文章 这里.
下面是使用 fs.readFile
和 fs.writeFile
复制文本文件的示例:
var fs = require('fs');
var copyFile = function(source, destination, next) {
// we should read source file first
fs.readFile(source, function(err, data) {
if (err) return next(err); // error occurred
// now we can write data to destination file
fs.writeFile(destination, data, next);
});
};
这是使用copyFile
函数的示例:
copyFile('foo.txt', 'bar.txt', function(err) {
if (err) {
// either fs.readFile or fs.writeFile returned an error
console.log(err.stack || err);
} else {
console.log('Success!');
}
});
Common node.js 模式表明回调函数的第一个参数是一个错误。您应该使用此模式,因为所有控制流模块都依赖于它:
next(new Error('I cannot do it!')); // error
next(null, results); // no error occurred, return result
尽可能简单地尝试此示例,只需复制保存新文件.js执行节点新文件即可运行应用程序。
function myNew(next){
console.log("Im the one who initates callback");
next("nope", "success");
}
myNew(function(err, res){
console.log("I got back from callback",err, res);
});
我们正在创建一个简单的函数,如下所示
callBackFunction (data, function ( err, response ){
console.log(response)
})
// callbackfunction
function callBackFuntion (data, callback){
//write your logic and return your result as
callback("",result) //if not error
callback(error, "") //if error
}
//delay callback function
function delay (seconds, callback){
setTimeout(() =>{
console.log('The long delay ended');
callback('Task Complete');
}, seconds*1000);
}
//Execute delay function
delay(1, res => {
console.log(res);
})
const fs = require('fs');
fs.stat('input.txt', function (err, stats) {
if(err){
console.log(err);
} else {
console.log(stats);
console.log('Completed Reading File');
}
});
"fs"是一个节点模块,可帮助您读取文件。回调函数将确保名为"input.txt"的文件在执行之前被完全读取。fs.stat() 函数用于获取文件大小、创建日期和修改日期等文件信息。
这篇博文写得很好:
https://codeburst.io/javascript-what-the-heck-is-a-callback-aba4da2deced
function doHomework(subject, callback) {
alert(`Starting my ${subject} homework.`);
callback();
}
function alertFinished(){
alert('Finished my homework');
}
doHomework('math', alertFinished);
// Traditional JS way
function display(result) {
console.log("Sum of given numbers is", result);
}
function calculateSum(num1, num2, callback) {
console.log("FIrst number is", num1, "and second number is", num2);
const result = num1 + num2;
callback(result);
}
calculateSum(10, 20, display);
// Node JS way
const display = function(result) {
console.log("Sum of given numbers is", result);
}
const calculateSum = function(num1, num2, callback) {
console.log("FIrst number is", num1, "and second number is", num2);
const result = num1 + num2;
callback(result);
}
calculateSum(10, 20, display);
// By using anonymous function
const calculateSum = function(num1, num2, callback) {
console.log("FIrst number is", num1, "and second number is", num2);
const result = num1 + num2;
callback(result);
}
calculateSum(10,20, function(result) {
console.log("Sum of given numbers is", result)
});
// By using arrow function
const calculateSum = function(num1, num2, callback) {
console.log("FIrst number is", num1, "and second number is", num2);
const result = num1 + num2;
callback(result);
}
calculateSum(10, 20, x => console.log("Sum of given numbers is", x));
callback
是作为参数传递给Higher Order Function
(维基百科)的函数。回调的简单实现是:
const func = callback => callback('Hello World!');
要调用函数,只需将另一个函数作为参数传递给定义的函数。
func(string => console.log(string));
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- nodeJs 回调简单示例
- 主干:在回调中维护对模型的“this”引用的最简单方法
- 访问它外部的回调函数参数的简单方法是什么
- JS加载顺序 - 滚动JS禁用,回调解决方案,或者更简单
- 为我的简单 JavaScript 函数添加回调功能
- 我试图使用jquery或javascript回调一个简单的动画
- 带有侦听器和回调的简单计数器
- Javascript回调函数,onreadystatechange,在一个简单的ajax示例中
- 为什么这个简单的回调函数不能工作?
- 用一个简单的例子来理解Javascript回调
- jQuery简单的回调函数
- 如何将简单的$http与回调转换为使用承诺
- 回调函数的使用值,简单示例
- 什么是通过回调加载谷歌API或谷歌的区别.加载或简单的脚本块
- 简单的聊天程序在流星.如何在新消息传入时调用回调函数?
- 在回调函数中传递参数的简单说明
- 回调功能的优点,用简单的英语和真实的例子
- 最简单的是什么?从javascript内部回调中访问外部this的最短方式