我需要严格按顺序调用一堆函数.下一个函数等到前一个函数完成之前,这一点也非常重要.
现在我正在使用链式回调:
callMe1(function(){
callMe2(function(){
callMe3(function(){
callMeFinal();
});
});
});
Run Code Online (Sandbox Code Playgroud)
这有效,但似乎有点难看.
对于不同方法的任何建议?
很多时候,我发现自己使用了一个回调函数,并且我没有方便的文档,并且很高兴看到所有要传递给该回调函数的参数.
// callback is a function that I don't know the args for...
// and lets say it was defined to be used like: callback(name, number, value)
something.doSomething( callback );
Run Code Online (Sandbox Code Playgroud)
我怎样才能确定它传入的args是什么?
注意:当代码本身被混淆和缩小时(查看很多js框架),查看源代码可能是无用的
我试图掌握Javascript异步函数和回调.
我被困在回调函数的概念上,我在一些地方阅读:它们用于顺序执行代码(主要是在jquery的上下文中,例如animate)和一些特别在Nodejs上下文的地方; 它们用于并行执行异步并避免阻塞代码.
因此,本主题的一些专家可以阐明这一点,并在我的脑海中清除这个模糊(例子??).所以我可以考虑使用回调函数
或者这完全取决于您在代码中调用/放置回调函数的位置?.
谢谢,
PS:我很害怕这个问题会接近主观但我仍然可以期待这个问题的具体答案(也许是一些例子)
编辑:实际上这是来自互联网的例子让我很暧昧:
function do_a(){
// simulate a time consuming function
setTimeout( function(){
console.log( '`do_a`: this takes longer than `do_b`' );
}, 1000 );
}
function do_b(){
console.log( '`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`' );
}
do_a();
do_b();
Run Code Online (Sandbox Code Playgroud)
结果
`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`
`do_a`: this takes longer than `do_b`
Run Code Online (Sandbox Code Playgroud)
当JS是顺序的时候,根据我的理解,do_b应该总是在do_a之后.
我有一个自定义视图组件.我在片段或活动中使用它.我想知道当它从片段/活动中被销毁时是否有回调?
在Thrift中,可以使用oneway修饰符将调用指定为异步.
显然,不可能定义一个回调,但是在完成函数的执行时执行.
似乎我唯一的可能性是给我的Thrift客户端(PHP)一些"服务器"功能,这样,当在服务器端完成繁重的计算时,我可以向它发送通知.这意味着我应该有一个新的.thrift文件,新的定义,新的服务和所有其余的,我应该用Thrift生成php-server端代码.
即使这是可行的,对我来说这看起来有点过分,我想知道是否有更聪明的方法来实现回调.
期待你的一些反馈,伙计们.
我正在制作一个对象,用于下载所有视图控制器的内容.该对象是单例实例,并且在下载完成后具有带有接收数据的回调方法.它还有一个委托属性,以便在下载完成后知道要回调哪个对象.
有多个控制器使用此共享实例,我的问题是如何回调请求下载的正确视图控制器.
我的方法是使用委托,但问题是,由于其他视图控制器也是它的委托,下载对象可以回调每个对象,这将很难跟踪.
我想知道这是否是一种可接受的写回调的方法:
存储回调:
struct EventHolder {
std::function<void()> Callback;
EventTypes::EventType Type;
};
std::vector<Events::EventHolder> EventCallbacks;
Run Code Online (Sandbox Code Playgroud)
方法定义:
void On(EventType OnEventType,std::function<void()>&& Callback)
{
Events::EventHolder NewEvent;
NewEvent.Callback=std::move(Callback);
NewEvent.Type=OnEventType;
EventCallbacks.push_back(std::move(NewEvent));
}
Run Code Online (Sandbox Code Playgroud)
绑定事件:
Button->On(EventType::Click,[]{
// ... callback body
});
Run Code Online (Sandbox Code Playgroud)
我最大的问题是关于通过值传递回调.这是一种有效的方法吗?
在Mochajs中,他们使用"done()"来测试异步代码,如下所示:
describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user = new User('Luna');
user.save(function(err) {
if (err) throw err;
done();
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
这究竟是什么意思?我做了console.log(done.toString()),我得到了这个:
function (err) {
if (err instanceof Error || toString.call(err) === '[object Error]') {
return done(err);
}
if (err) {
if (Object.prototype.toString.call(err) === '[object Object]') {
return done(new Error('done() invoked with non-Error: '
+ JSON.stringify(err)));
}
return done(new Error('done() invoked with non-Error: ' + err));
}
done();
}
Run Code Online (Sandbox Code Playgroud)
这里的done()最后是否与第一段代码中的done()不同?
就个人而言,我更倾向于使用Swift中的委托进行回调以获得简单的逻辑关联,因为它非常直观且易于理解.同时,有些人更喜欢委托,因为委托是其他语言的流行模式,比如C#.
我在网上找到了一些讨论:
1."为什么你不应该在Swift中使用代理?" https://medium.cobeisfresh.com/why-you-shouldn-t-use-delegates-in-swift-7ef808a7f16b#.hqb7zrc1v
2.苹果正在将注意力转移到回调模式上 https://www.reddit.com/r/swift/comments/2ces1q/closures_vs_delegates/
街区或代表? http://blog.stablekernel.com/blocks-or-delegates/
在阅读完这些讨论之后,我仍然不确定偏好.我想知道什么时候更好地使用闭包,何时更好地使用代理?和原因?
谢谢!