2017-03-04 41 views
3

我正在遵循一個教程來爲圖像創建一個上傳系統。不理解作爲參數的新函數的參數

現在下面的函數被用於上載,並且它使用外部模塊強大

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需要兩個參數,新的函數採用請求新功能但3個新的論點。

我似乎無法理解它。這三個新論據從何而來?它與外部庫有關還是我不正確理解JavaScript?

在此先感謝。

+0

這是外部庫預期的回調函數。你應該真的去閱讀關於JS的基礎知識。 http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/,然後找到實現了''parse''函數的Formidable的源代碼。 – tiblu

回答

2

form.parse需要2個參數,第二個參數爲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代碼我們稱之爲callback 3個ARGS。現在我們可以在callback函數中使用它們

0

作爲第二個參數傳遞給form.parse方法的第二個參數是一個回調函數。它在表單解析完成後由form.parse調用。回調函數的參數值來自form.parse方法。

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。它將在某個時候被該函數「回調」,並在被調用時被調用(很可能,雖然不能保證)有3個參數。