2017-10-15 4 views
1

Ich habe Probleme mit dem folgenden Code:Legendes Callback-Funktion

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 Versuch, Argumente zu Callback-Funktion zu übergeben, aber wenn ich tue, wie oben Ich habe den folgenden Fehlercode:

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) 

Und natürlich, wenn ich den gleichen Code ohne Argumente ausführen, wird es funktionieren.

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"); 
} 

Ich würde gerne wissen, was ich hier genau falsch mache. Wie verwende ich diese Callback-Funktion korrekt, wenn ich Argumente übergeben möchte.

(ps: im nicht Englisch als Muttersprache, sry dafür)

+0

requestedOrder (ordernumber, returnOrder); returnOrder ist nicht definiert und Sie legen es nicht fest, um die Funktion requestedOrder – episch

Antwort

4

Warum Sie diesen Fehler?

setTimeout erwartet, dass die Callback-Funktion als erstes Argument, aber an erster Stelle Sie eine Nummer übergeben zu bekommen, warum also die Ausnahme. Der zweite Fall funktioniert, weil Sie die orderNumber von der ersten Stelle entfernen, und die Funktion bekommt es.

Sie müssen die Argumente der Rückruffunktion nach dem 2. Platz übergeben. Siehe die setTimeout Funktionssignatur. Zuerst geht die Callback-Funktion, 2. - die Uhrzeit, zumindest um die Funktion aufzurufen und danach geht alles, was übergeben wird, an die Callback-Funktion als Argumente.

Dies ist die Signatur der Funktion - [] sind optional.

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

-Code

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

aufzurufen. Sie wollen auch 'returnOrder' einen Parameter geben und ihn irgendwo verwenden. – Bergi

+0

@Bergi Danke. –

+0

Die nach der Verzögerung übergebenen Params werden nicht immer an den Callback übergeben, eine anonyme, selbstaufrufende Funktion wäre sicherer – user7951676