调用"父功能"的正确方法是什么?来自异步回调,NodeJS

时间:2015-12-17 14:32:59

标签: javascript node.js asynchronous

函数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 );

4 个答案:

答案 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中编写无阻塞代码很重要。