在nodejs中使api调用同步

时间:2017-04-25 06:52:41

标签: node.js asynchronous async-await synchronous

我的代码是这样的:

for(let query of array1){ 
   request.get(query, function(err, res, body){
     var array2 = body
     for (let query2 of array2){
        request.get(query, function(err, res, body){
            var variable1 = body
            updateDB(query, query2 , variable1)
         });
     }
   });
}

假设Array1为[1,2,3,4]

第一个循环array2将[a,b,c,d](第二个循环将给出[e,f,g,h]等等。)

现在我的updateDB只更新了每个循环中array2的第一个值[在上面的例子中仅针对a和e]。我希望它在它移动到第二组array2(即[e,f,g,h])之前循环遍历array2的所有元素(如b,c,d)。

我知道这是因为js的异步性质而发生的。但我该如何解决呢?如何使外循环等待内循环完成?

希望所以我很清楚。在此先感谢!!

3 个答案:

答案 0 :(得分:1)

你可以使用NPM上的async.js模块来做到这一点。对于您的情况,您要搜索的功能是score。以下是它的文档:https://caolan.github.io/async/docs.html#seriesasync.series可用于首先运行第一个get请求,然后运行第二个get请求,但这并不意味着它将等待第一个循环(upper for)完成itteration以转到下一个循环。为此,您可能希望嵌套两个异步循环。

答案 1 :(得分:0)

你可以使用我最喜欢的async模块,因为你很容易从函数名中理解它是如何工作的,但你也可以使用Javascript原生的promises,这是一个很好的加分,因为许多初学者甚至在不知道回调是如何工作的情况下使用承诺!所以承诺正在成为一种标准。

如果您想详细了解这些概念:可以查看tutorial for asyncthis one for promises

答案 2 :(得分:0)

如果您想首先迭代循环,那么您可以使用async.EachSeries

所以它将迭代&你将得到一个一个值和一个值你可以使用回调,因此它将同步工作。