NodeJs 回调简单示例

有没有人能给我一个简单的例子 nodeJ 回调,我已经在很多网站上搜索相同的,但不能正确理解它,请给我一个简单的例子。

getDbFiles(store, function(files){
getCdnFiles(store, function(files){
})
})

我想做那样的事。

276199 次浏览
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: 为第一个参数的回调提供“ truthy 值”(一个 Error 对象)的版本,或者为 Error 参数提供 null 的版本。

下面是一个用 fs.readFilefs.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!');
}
});

Js 模式表明回调函数的第一个参数是一个错误。您应该使用这种模式,因为所有的控制流模块都依赖于它:

next(new Error('I cannot do it!')); // error


next(null, results); // no error occurred, return result

回调函数只是一个传递给另一个函数的函数,这样函数可以在以后调用它。这在异步 空气污染指数中很常见; 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 函数: readFilereadFileSync

readFile函数是异步的,而 readFileSync显然不是。您可以看到,他们希望您尽可能使用异步调用,因为他们将其称为 readFilereadFileSync,而不是 readFilereadFileAsync。下面是同时使用这两个函数的示例。

同步:

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);

首先,我们创建一个回调函数,它接受两个参数 errdata。异步函数的一个问题是捕获错误变得更加困难,因此许多回调样式的 API 将错误作为第一个参数传递给回调函数。最佳实践是在执行其他操作之前检查 err是否有值。如果是这样,停止回调的执行并记录错误。

当抛出异常时,同步调用有一个优势,因为您可以简单地用 try/catch块捕获它们。

try {
var data = fs.readFileSync('test.txt');
console.log(data);
} catch (err) {
console.error(err);
}

在异步函数中,它不是这样工作的。API 调用立即返回,因此 try/catch不会捕获任何内容。使用回调的正确的异步 API 将总是捕获它们自己的错误,然后将这些错误传递到回调中,您可以根据需要处理这些错误。

不过,除了回调之外,还有另一种常用的 API 样式,称为“承诺”。如果你想了解他们,那么你可以阅读我根据这个答案写的整篇博客文章 给你

尽可能简单地尝试这个示例,只需复制 save newfile.js do node newfile 来运行应用程序。

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
}
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’的文件在执行之前被完全读取。 函数的作用是获取文件大小、创建日期和修改日期等信息。

callback是作为参数传递给 Higher Order Function(维基百科)的函数。回调的一个简单实现是:

const func = callback => callback('Hello World!');

要调用该函数,只需将另一个函数作为参数传递给定义的函数。

func(string => console.log(string));

//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);
})

这篇博客文章写得很好:

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);