我正在按照教程制作图片上传系统。
现在使用以下功能进行上传,它使用外部模块强大
function upload(response, request) {
console.log("Request handler 'upload' was called.");
var form = new formidable.IncomingForm();
console.log("about to parse");
form.parse(request, function(error, fields, files) {
console.log("parsing done");
fs.rename(files.upload.path, "/tmp/test.png",
function(error) {
if (error) {
fs.unlink("/tmp/test.png");
fs.rename(files.upload.path, "/tmp/test.png");
}
});
response.writeHead(200, {"Content-Type": "text/html"});
response.write("received image:<br/>");
response.write("<img src='/show' />");
response.end();
});
}
form.parse需要2个参数,请求和新函数,但新函数需要3个新参数。
我似乎无法理解它。这三个新论点来自哪里?它与外部库有关,还是我不能正确理解JavaScript?
提前致谢。
答案 0 :(得分:2)
form.parse
取2个args,第二个arg是名为callback
的函数。回调从form.parse
实现获取参数。
让我们解释一下更简单的例子:
function foo(callback) {
var arg1 = 10;
var arg2 = 'string';
var arg3 = false;
// call function with args
callback(arg1, arg2, arg3);
};
function callback(num, str, bool) {
// we get args from foo implementation
console.log(num);
console.log(str);
console.log(bool);
}
foo(callback);
在foo
代码中,我们使用3个args调用callback
。现在我们可以在callback
函数
答案 1 :(得分:1)
考虑到这一点的方法是form.parse
采用两个参数 - 第一个由请求指示,第二个指示函数。第二个函数作为参数传递给form.parse
,以便某个时候该函数可以调用它。
你可能会更清楚地看到它是这样写的(它是相同的,但可以说,更清晰):
function upload(response, request) {
console.log("Request handler 'upload' was called.");
var process_request = function(error, fields, files) {
console.log("parsing done");
fs.rename(files.upload.path, "/tmp/test.png",
function(error) {
if (error) {
fs.unlink("/tmp/test.png");
fs.rename(files.upload.path, "/tmp/test.png");
}
});
response.writeHead(200, {"Content-Type": "text/html"});
response.write("received image:<br/>");
response.write("<img src='/show' />");
response.end();
};
var form = new formidable.IncomingForm();
console.log("about to parse");
form.parse(request, process_request );
}
在这种情况下,我们宣布了一个函数process_request
并将其传递给form.parse
。它会被叫回来#34;在某个时候,通过该函数调用它(最有可能,但不能保证),在调用时会调用3个参数。
答案 2 :(得分:0)
第二个参数传递给form.parse方法,因为第二个参数是回调函数。在解析表单后,由form.parse调用它。回调函数的参数值来自form.parse方法。