2017-08-12 65 views
0

我有这样的代码:不能处理JavaScript-的NodeJS的异步

function onDoneFunction() 
    { 

    console.log("done!"); 

    } 

    function generalQuery(generalArray, onDoneFunction) 
    { 

    function go(i) 
    { 

     if(i >= generalArray.length) 
     { 
      onDoneFunction(); 
     } 
     else 
     { 
      iteratorFunction(generalArray[i], function() 
      { 
      console.log("entering callback " + i); 
      return go(i + 1); 
      }); 

     } 
    } 

    go(0); 
    } 

而且我iteratorFunction看起来是这样的:

function iteratorFunction(partofquery, callback) 
{ 
    var index = generalArray.indexOf(partofquery); 

    collection.find(partofquery).then(function(data) 
    { 
     console("query completed " + index); 
    } 
} 

假如我的查询数组有两个元素,我看到这样的输出:

进入回调0

进入回调1个

查询完成0

查询完成1

但我想看到这一点:

进入回调0

查询完成0

enter荷兰国际集团的回调1

查询完成1

我一直在努力使循环等待迭代开始下一个之前完成。我尝试了很多东西。正如你所看到的,我也尝试过使用递归。但我无法做到这一点。你能告诉我我做错了什么吗?提前致谢。

+0

'。那么' - 啊,所以你需要链接一些承诺,看它的外观 –

+0

@JaromandaX你可以用我的代码示例显示吗? – jason

+0

可能重复[如何从异步调用返回响应?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

回答

1

简单的解决办法,以你的代码

function onDoneFunction() { 
 
    console.log("done!"); 
 
} 
 

 
function iteratorFunction(partofquery, index) { 
 
    return collection.find(partofquery).then(function(data) { 
 
     console("query completed " + index); 
 
    }); 
 
} 
 

 
function generalQuery(generalArray, onDoneFunction) { 
 
    function go(i) { 
 
     if (i < generalArray.length) { 
 
      console.log("performing query " + i); 
 
      return iteratorFunction(generalArray[i], i).then(function() { 
 
       return go(i + 1); 
 
      }); 
 
     } 
 
    } 
 
    go(0).then(onDoneFunction); 
 
}

然而,递归是不是最好的解决方案 - 但你没有问an example using my code

使用阵列#减少,而不是递归

function generalQuery(generalArray, onDoneFunction) { 
    generalArray.reduce((promise, item, index) => 
     promise.then(() => 
      iteratorFunction(item, index) 
     ), 
     Promise.resolve() 
    ).then(onDoneFunction); 
} 
+0

“onFunctionDone”和“onDoneFunction”是否相同? – jason

+0

等待 - 我搞砸了 –

+0

所以,我只需要取消回调并使用承诺,对吗? – jason