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函数: readFile
和readFileSync
。
readFile
函数是asynchronous的,而readFileSync
显然不是。 您可以看到他们打算尽可能使用asynchronous调用,因为他们将其称为readFile
和readFileSync
而不是readFile
和readFileAsync
。 这是一个使用这两个函数的例子。
同步:
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函数,接受两个参数err
和data
。 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.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!'); } });
常见的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 }