我从nodejs开始,并在回调上阅读基础知识,这里我有一个代码,
exports.handler = (event, context, callback) => {
var bx = require('barcode-js');
// Set default values.
var params = {
input: './1.bmp',
type: 'qrcode'
};
bx.analyze(params, function (err, results) {
if (err) {
callback('There was an error processing this image: ' + err)
}
results.forEach(function(result) {
callback(null,'Result type :' + result.type + '\t'+'Value: '+result.value);
});
});
};
此行中bx.analyze(params, function (err, results) {
发生了什么。为什么我们不能只使用bx.analyze(params)?
答案 0 :(得分:1)
这是使代码异步的回调函数。
表示您将函数作为参数传递给bx.analyze(params)
方法。这个回调方法在bx.analyze(params)
完成后执行,因此它不会阻塞其他代码,使代码异步。
如果您需要执行此回叫的方式,那么您必须查找Event loop
,在Google中搜索,有大量文档。
答案 1 :(得分:1)
如果我们使用bx.analyze(params)
那么它就是阻塞(同步)代码。事件循环停止,直到bx.analyze(params)
没有返回任何值和
没有错误处理。
如果我们使用bx.analyze(params, function (err, results) { });
则它是异步(非阻塞)代码。事件循环不会等待返回值,它会转到下一个语句,当bx.analyze(params, function (err, results) {
返回回调事件循环时,它会处理它。
还有错误处理
如需深入了解,请参阅此视频https://www.youtube.com/watch?v=8aGhZQkoFbQ
答案 2 :(得分:1)
第二个参数是function
。称为callback
。
执行异步功能时,不能等待其返回值:
var result = bx.analyze(params); //you can't do this
所以你告诉函数当它完成它的工作时,只需调用callback
(你传递的函数作为第二个参数)。
//so `analyze()` will call your passed function rather than `return` the result
//`err` will contain the error object if anything wrong happened in the analyze() function
//`results` will contain result if everything was fine
bx.analyze(params, function (err, results) {
if (err)
callback('There was an error processing this image: ' + err)
});
我强烈建议您了解异步代码在javascript中的工作原理。直到那时你才能学习Nodej ..
<强>更新强>
在您的代码中,函数handler
是一个异步函数,因此它需要callback
作为参数(就像analyze()
)。
当此功能完成其工作时,它会调用callback
。
现在在您的代码中,它被调用2次:
1)发生错误时,此函数将调用回调并将错误传递给它:
if (err) {
callback('There was an error processing this image: ' + err); //its passing "err" returned from analyze()
}
2)当一切顺利时,它会通过结果集:
callback(null, 'Result type :' + result.type + '\t'+'Value: '+result.value); //the 1st parameter is being passed as "null" because there is no error in it, and second parameter passes the result