我无法获取meal对象中的值虽然我在顶部创建了新对象,但任何人都可以告诉哪个是回调函数中最好的过程访问变量
let baseUrl = NSSearchPathForDirectoriesInDomains(.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print("Base Url: \(baseUrl.first!)")
return baseUrl.first!
}
答案 0 :(得分:0)
您需要在回调函数中再次使用callback
。 :)
你正在做一些异步,这意味着,没有序列代码。 (至少,我记住这一点,不知道别人怎么想这个。)所以,代码应该是:
function somehow(callback) { // you get the result from callback
var meals = new Object();
passObj.data = _.map(passObj.data, (x)=> {
dbHelpder.query(`select * from meals where meal_category = ${x.category_id}`,(error,result)=>{
meals = x.result;
passObj.total = 555;
callback(meals); // Here you get the result
});
}
return x;
}
因此,当您打算使用此功能时,它应该是
function afterMeals(resultMeals) {
// do something on the meals
}
somehow(afterMeals);
使用其他一些技术可以使其更清晰(例如promise
),但实际上你无法避免callback
。
答案 1 :(得分:0)
首先,我看不出passObj究竟是什么,显然它是在其他地方定义的。
其次,回调函数不会像您认为的那样起作用。通常,使用它们的一个原因是实现异步调用,因此返回值是不可用的。
这个想法如下。通常你有这样的电话:
var myFunc1 = function(){
return 42;
}
var x = myFunc1();
myFunc2(x);
然而,当myFunc1是异步调用时,如果不使用某种类型的promise,则返回值是不可能的,这本身就是一个主题。因此,如果myFunc1是异步调用并且返回了42,例如通过服务器,然后只返回一个值导致该值为null,因为当您到达返回时,不会计算和接收返回值。
这是引入回调的原因。它们以某种方式工作,允许异步调用并在调用完成后以您希望的方式继续进行。要在上面的示例中显示:
var myFunc1 = function( myFunc2, params ){
// do async stuff here, then call the callback function from myFunc1
...
myFunc2(x);
}
因此异步函数不返回任何内容。它使得它需要进行调用或计算以及何时完成(在x已被声明并赋值的示例中)myFunc2(在我们的示例中是回调函数)直接从异步函数调用。
长话短说 - 在回调函数中直接执行x所需的操作。