2017-02-16 6 views
0

Я пробую простой пример с использованием функции обратного вызова, но у него есть некоторые проблемы.Как исправить «обратный вызов - это не ошибка функции»?

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

И консоль говорит callback2 is not a function.

Я пробовал console.log(typeof(callback2)), и он говорит, что callback2 является функцией.

Итак, в чем проблема в этой ситуации? Когда я просто набираю console.log(categories), он работает хорошо.

+0

Где ваша 'функция getData'? –

+0

Я не писал, потому что он работает хорошо. Любая проблема? – ahnpersie

ответ

1

Вы должны сделать что-то вроде этого: Важно, чтобы пройти второй обратный вызов уже в первой функции в качестве аргумента.

Если вы этого не сделаете, вы можете сохранить эту функцию в глобальной переменной, но тогда она не является обратным вызовом.

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

С Global 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

Хорошо, я вижу. Скрытие результата и обратного вызова в качестве параметра важна не глобальная функция – ahnpersie

0

как я видел, вы передаете callback2 в качестве параметра для функции обратного вызова, а затем не загружаете глобальное определение, которое использует собственное определение области обратного вызова.

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

Удаление callback2 из Params метода будет вызывать callback2 определен предыдущий, и не находите в собственной области

+0

Тогда как я могу правильно использовать? – ahnpersie

2

Вы должны сделать что-то вроде этого.

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

Спасибо. Я забыл установить параметры обратного вызова – ahnpersie

+0

Это может быть опасно, потому что я думаю, что результат будет получен из getData. У вас должен быть как обратный вызов в качестве параметра, так и вызов обратного вызова следующим образом: «вызов (результат, обратный вызов2)» в функции получения данных. См. Мой пример. – patrick