2017-10-15 73 views
1

我有下面的代碼的麻煩:理解回調函數

var placeingOrders = function(orderNumber) { 
    console.log("Order number: ", orderNumber); 
    requestedOrder(orderNumber, returnOrder); 
}; 

function requestedOrder(orderNumber, callback) { 
    setTimeout(orderNumber, callback, 5000); 
} 

function returnOrder() { 
    console.log("Order number: " , " is delivered"); 
} 

IM試圖傳遞迴調函數的參數,但是當我做如上我得到了以下錯誤代碼:

timers.js:348 
    throw new TypeError('"callback" argument must be a function'); 
    ^

TypeError: "callback" argument must be a function 
    at exports.setTimeout (timers.js:348:11) 

而且當然,如果我沒有參數運行相同的代碼,它會工作。

var placeingOrders = function(orderNumber) { 
    console.log("Order number: ", orderNumber); 
    requestedOrder(returnOrder); 
}; 

function requestedOrder(callback) { 
    setTimeout(callback, 5000); 
} 

function returnOrder() { 
    console.log("Order number: " , orderNumber , " is delivered"); 
} 

我想知道我在這裏做了什麼錯誤。如果我想傳遞參數,我該如何正確使用此回調函數。

(PS:IM不是以英語爲母語,SRY爲)

+0

requestedOrder(ORDERNUMBER,returnOrder); returnOrder沒有定義,你不設置它調用函數requestedOrder – episch

回答

4

爲什麼你得到這個錯誤?

setTimeout期望得到的回調函數作爲第一個參數,但在第一個地方傳遞一個數字,那麼爲什麼例外。第二種情況是有效的,因爲你從第一個地方刪除了orderNumber,一個函數得到它。

您需要在第二位之後傳遞迴調函數的參數。請參閱setTimeout函數簽名。首先進入回調函數,第二個 - 時間,至少要調用該函數,之後所有傳遞的函數都作爲參數傳遞給回調函數。

這是功能的簽名 - []是可選的。

setTimeout(function[, delay, param1, param2, ...]) 

代碼

var placeingOrders = function(orderNumber) { 
 
    console.log("Order number: ", orderNumber); 
 
    requestedOrder(orderNumber, returnOrder); 
 
}; 
 
    
 
function requestedOrder(orderNumber, callback) { 
 
    setTimeout(callback, 5000, orderNumber); 
 
} 
 
    
 
function returnOrder(orderNumber) { 
 
    console.log("Order number: " + orderNumber + " is delivered"); 
 
} 
 

 
placeingOrders(14);

+0

你也想給'returnOrder'一個參數,並在某處實際使用它 – Bergi

+0

@Bergi謝謝。 –

+0

延遲後傳遞的參數並不總是傳遞給回調函數,使用匿名自調用函數會更安全 – user7951676