2017-02-16 3 views
0

Ich versuche ein einfaches Beispiel mit Callback-Funktion, aber es hat ein Problem.Wie repariere 'Rückruf ist kein Funktionsfehler'?

(function ddd() { 
    const categories = []; 
    const url2 = 'http://www.example.com'; 

    const callback2 = function (res) { 
    console.log(res); 
    } 

    const callback = function (res,callback2) { 
    res.products.forEach((el) => { 
     categories.push({itemLabel: el.id, categoryLabel: 'gifts'}); 
    }); 
    callback2(categories); 
    }; 

    getData(url2, callback); 
})(); 

Und Konsole sagt callback2 is not a function.

Ich versuchte console.log(typeof(callback2)) und es sagt callback2 ist eine Funktion.

Also, was ist das Problem in dieser Situation? Wenn ich stattdessen console.log(categories) eintippe, funktioniert es gut.

+0

Wo ist Ihr 'getData' Funktion? –

+0

Ich habe nicht geschrieben, weil es gut funktioniert. Irgendein Problem? – ahnpersie

Antwort

1

Sie haben so etwas zu tun: Wichtig sind den zweiten Rückruf bereits in der ersten Funktion als Argument übergeben.

Wenn Sie nicht tun, was zu tun ist, können Sie die Funktion in einer globalen Variablen speichern, aber dann ist es nicht wirklich ein Rückruf.

(function ddd() { 
 
    const categories = []; 
 
    const url2 = 'http://www.example.com'; 
 

 
    const callback2 = function (res) { 
 
    console.log(res); 
 
    } 
 

 
    const callback = function (res,callback2) { 
 
    res.products.forEach((el) => { 
 
     categories.push({itemLabel: el.id, categoryLabel: 'gifts'}); 
 
    }); 
 
    callback2(categories); 
 
    }; 
 
\t function getData(url, callback, callback2) { 
 
    \t callback({products: [{id: 10}]}, callback2); 
 
    }; 
 
    getData(url2, callback, callback2); 
 
})();

Mit Globale Callback2:

(function ddd() { 
 
    const categories = []; 
 
    const url2 = 'http://www.example.com'; 
 

 
    const callback2 = function (res) { 
 
    console.log(res); 
 
    } 
 

 
    const callback = function (res) { 
 
    res.products.forEach((el) => { 
 
     categories.push({itemLabel: el.id, categoryLabel: 'gifts'}); 
 
    }); 
 
    callback2(categories); 
 
    }; 
 
\t function getData(url, callback) { 
 
    \t callback({products: [{id: 10}]}); 
 
    }; 
 
    getData(url2, callback); 
 
})();

+0

Okay, ich verstehe. Ergebnis und Callback als Parameter, nicht als globale Funktion zu verbergen, ist wichtig – ahnpersie

0

Wie ich gesehen habe, übergeben Sie Callback2 als Parameter zum Funktionsrückruf, dann laden Sie nicht die globale Definition, die er seine eigene Bereichsdefinition des Rückrufs verwendet.

const callback = function (res) { 
    res.products.forEach((el) => { 
     categories.push({itemLabel: el.id, categoryLabel: 'gifts'}); 
    }); 
    callback2(categories); 
    }; 

Entfernen callback2, von params Methode, rufen callback2 vorherigen definiert, und in eigenen Rahmen nicht finden,

+0

Dann wie kann ich richtig verwenden? – ahnpersie

2

Sie haben so etwas zu tun.

getData(url2, callback(result, callback2)); 
+0

Danke. Ich habe vergessen, die Parameter des Callbacks zu setzen – ahnpersie

+0

Das kann gefährlich sein, weil ich denke, dass das Ergebnis aus getData kommen wird. Sie sollten beide Callbacks als Parameter haben und den Callback wie folgt aufrufen:'callback (result, callback2) 'in der Funktion get data. Siehe meine Probe. – patrick

Verwandte Themen