nodeJscallback简单的例子

任何人都可以给我一个简单的nodeJscallback的例子,我已经在很多网站上search过相同的东西,但是不能正确理解,请举个简单的例子。

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

关于节点types的错误约定

Costa问如果我们要遵守节点错误callback约定,这将是什么样子。

在这个约定中,callback期望至less接收一个参数,即第一个参数,作为错误。 可选地,我们将有一个或多个额外的参数,取决于上下文。 在这种情况下,上下文就是我们上面的例子。

在这里,我重写了这个约定中的例子。

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

行为的唯一区别将取决于你已经定义的usingItNow版本:为第一个参数的callback提供一个“truthy值”(一个Error对象)的函数,或者为错误提供null的函数论据。

callback函数只是一个函数,您可以将其传递给另一个函数,以便函数稍后调用它。 这在asynchronousAPI中很常见; API调用会立即返回,因为它是asynchronous的,所以您可以将一个函数传递给它,API完成其asynchronous任务后可以调用该函数。

我能想到的最简单的例子是setTimeout()函数。 这是一个接受两个参数的全局函数。 第一个参数是callback函数,第二个参数是毫秒延迟。 该函数被devise为等待适当的时间,然后调用你的callback函数。

 setTimeout(function () { console.log("10 seconds later..."); }, 10000); 

您可能以前看过上面的代码,但没有意识到您传递的函数被称为callback函数。 我们可以重写上面的代码,使其更加明显。

 var callback = function () { console.log("10 seconds later..."); }; setTimeout(callback, 10000); 

callback被用在Node的所有地方,因为Node是从底层构build起来的,在它所做的每件事情上都是asynchronous的。 即使在与文件系统交谈时也是如此。 这就是为什么大量的内部节点API接受callback函数作为参数,而不是返回可以分配给variables的数据。 相反,它会调用你的callback函数,传递你想要的数据作为参数。 例如,您可以使用Node的fs库来读取文件。 fs模块公开了两个独特的API函数: readFilereadFileSync

readFile函数是asynchronous的,而readFileSync显然不是。 您可以看到他们打算尽可能使用asynchronous调用,因为他们将其称为readFilereadFileSync而不是readFilereadFileAsync 。 这是一个使用这两个函数的例子。

同步:

 var data = fs.readFileSync('test.txt'); console.log(data); 

上面的代码阻塞了线程执行,直到test.txt所有内容都被读入内存并存储在variablesdata 。 在节点这通常被认为是不好的做法。 有时候有用的时候,比如写一个快速的小脚本来做一些简单而乏味的事情,而且你不太在乎每一纳秒的时间。

asynchronous(带callback):

 var callback = function (err, data) { if (err) return console.error(err); console.log(data); }; fs.readFile('test.txt', callback); 

首先我们创build一个callback函数,接受两个参数errdata 。 asynchronous函数的一个问题是捕获错误变得更加困难,所以许多callback式API作为callback函数的第一个parameter passing错误。 在做其他事情之前,检查一下err是否有价值是最好的做法。 如果是,请停止执行callback并logging错误。

当出现exception时,同步调用具有优势,因为您可以简单地通过try/catch块捕获它们。

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

在asynchronous函数中,它不会这样工作。 API调用会立即返回,所以try/catch没有什么可用。 正确的使用callback的asynchronousAPI将始终捕获自己的错误,然后将这些错误传递到callback函数中,您可以根据需要处理它们。

除了callback之外,还有另外一种stream行的API,通常被称为诺言。 如果你想阅读他们,那么你可以在这里阅读我写的基于这个答案的整个博客文章。

这是一个用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!'); } }); 

常见的node.js模式表明callback函数的第一个参数是一个错误。 您应该使用这种模式,因为所有的控制stream模块都依赖于它:

 next(new Error('I cannot do it!')); // error next(null, results); // no error occurred, return result 

尝试这个例子,只要你可以读取,只需复制保存newfile.js做节点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); }); 

我们正在创build一个简单的函数

 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 } 
Interesting Posts