函数f1()执行异步作业,然后使用结果调用回调(' child')。回调检查结果,如果发现它们不合适,则回调应再次调用f1()。这应该发生,直到从f1()返回合适的结果。
在NodeJS中执行此操作的正确方法是什么? 我目前的解决方案:
function f1( args, callback ) {
// do async job
callback(answ); // answ is returned by async job
}
var args;
// prepare args
function f2(answ) {
if ( anws ) return true; // Urahh, all ok
// change args and try next call
f1(args, f2);
}
f1( args, f2 );
答案 0 :(得分:1)
我认为这是一个更好的设计
function f1(a, callback) {
console.log(a);
callback(a, f1); // callback points to f2
}
function f2(a, callback) {
if (a >= 10) return;
callback(a+1, f2); // callback points to f1
}
// initial args = 0
f1(0,f2);
这样,您的代码中没有任何外部状态(args
)。 f2
仍然需要调整args,但修改(我的代码中的a+1
)会直接传递给被调用的函数。
此外,f1
在回调中指定自己作为在需要发生循环的情况下应该调用的函数。这样,f2
可以用于任何可以调用它的“父”,只要父对象传递给它自己的引用。
很酷的东西。
输出
0 1 2 3 4 五 6 7 8 9 10
提示:在
无法真正使用异步调用的返回值true
中返回f2
没有意义。
答案 1 :(得分:0)
不确定它是否是理想的流程,但这可行。
function async () {
return async_promise;
}
function run_async (args) {
async(args).then(success, run_async.bind(null, args));
}
function success () {
// fin
}
run_async(args);
通过使用promises,你可以创建一个更优雅的循环,但它仍然不是很好。也许需要更多信息来帮助您找到更好的解决方案。
答案 2 :(得分:-1)
您的解决方案正在运行,但我通常会在此案例中使用承诺。
为什么呢?因为它通常更容易被发现并且避免陷入“回调地狱”。
由于ES6规范,它现在在Node 5.0上本地工作:
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise
对于你的情况,我认为这样的事情应该有效:
apt-get install build-essential
没有测试,适应这个想法。
答案 3 :(得分:-2)
我认为您的解决方案可行。但这取决于您工作的环境。我建议你使用process.nextTick()来处理这种类型的“递归” https://nodejs.org/docs/latest/api/process.html#process_process_nexttick_callback_arg
如果你想要真正的异步,在nodejs中编写无阻塞代码很重要。