nodeJs 回调简单示例
任何人都可以给我一个简单的nodeJs回调的例子,我已经在许多网站上搜索过相同的,但不能正确理解它,请给我一个简单的例子。
getDbFiles(store, function(files){
getCdnFiles(store, function(files){
})
})
我想做这样的事情...
任何人都可以给我一个简单的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
};
如果我们想模拟一个错误案例,我们可以像这样定义UseItNow。
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);
行为上的唯一区别取决于您定义的版本:将“真实值”(Error 对象)提供给第一个参数的回调的版本,或者为错误参数提供 null 的版本。usingItNow
回调函数只是一个传递给另一个函数的函数,以便该函数以后可以调用它。这在异步 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 是从头开始构建的,在它所做的一切中都是异步的。即使在与文件系统通信时也是如此。这就是为什么大量的内部节点API接受回调函数作为参数,而不是返回可以分配给变量的数据。相反,它将调用您的回调函数,将您想要的数据作为参数传递。例如,您可以使用 Node 的库来读取文件。该模块公开了两个唯一的 API 函数:和 。fs
fs
readFile
readFileSync
该函数是异步的,而显然不是。您可以看到,他们打算您尽可能使用异步调用,因为他们调用了它们而不是 and 。下面是使用这两个函数的示例。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);
首先,我们创建一个回调函数,该函数接受两个参数和 .异步函数的一个问题是,捕获错误变得更加困难,因此许多回调样式的 API 将错误作为第一个参数传递给回调函数。最佳做法是在执行任何其他操作之前检查是否具有值。如果是这样,请停止执行回调并记录错误。err
data
err
当存在引发异常时,同步调用具有优势,因为您只需使用块即可捕获它们。try/catch
try {
var data = fs.readFileSync('test.txt');
console.log(data);
} catch (err) {
console.error(err);
}
在异步函数中,它不是以这种方式工作的。API 调用会立即返回,因此 .使用回调的正确异步 API 将始终捕获自己的错误,然后将这些错误传递到回调中,以便您可以根据需要对其进行处理。try/catch
除了回调之外,还有另一种常用的API风格,称为promise。如果您想阅读有关它们的信息,那么您可以阅读我根据此答案在此处撰写的整个博客文章。