2017-02-16 50 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); 
 
})();

随着全球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中产生。您应该将回调作为参数,并像这样调用回调函数:get data函数中的'callall(result,callback2)'。看我的样品。 – patrick