我有一个for_users
函数,它从Web服务获取用户数组,在接收的数组上执行传递函数f
,然后调用继续f_then
回调。在定制for-each循环中链接回调,同时支持同步和异步函数
// Execute f on every user, then f_then.
function for_users(f, f_then)
{
// Get all users from the database, in user_array
db.get_all_users(function(user_array)
{
// Execute f on every user
user_array.forEach(f);
// Call continuation callback
f_then();
});
}
当调用for_users
,通过异步函数为f
参数,我想所有的f
回调调用f_then
之前结束。这在当前代码中显然不会发生,因为user_array.forEach(f)
在开始下一次迭代之前不会等待f
完成。
这里的问题的情况为例:
function example_usage()
{
var temp_credentials = [];
for_users(function(user)
{
// Get credentials is an asynchronous function that will
// call the passed callback after getting the credential from
// the database
database.get_credentials(user.ID, function(credential)
{
// ...
});
}, function()
{
// This do_something call is executed before all the callbacks
// have finished (potentially)
// temp_credentials could be empty here!
do_something(temp_credentials);
});
}
我如何能实现这样for_users
如果f
是一个异步功能,f_then
只有当所有f
功能完成叫什么名字?
虽然有时候,通过的f
到for_users
不是异步的,上面的实现就足够了。有没有办法编写一个通用的for_users
实现,可以按照预期的方式为异步和同步f
函数工作?