【问题标题】:making api calls in sync in nodejs在nodejs中同步进行api调用
【发布时间】:2017-04-25 17:44:06
【问题描述】:

我的代码是这样的:

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 的异步特性而发生的。但是我该如何解决呢?如何让外循环等待内循环完成?

希望我足够清楚。提前致谢!

【问题讨论】:

  • 这不是一个异步问题,而是一个经典的闭包问题。查找“for 循环中的 JavaScript 闭包”以及为什么通常不鼓励这样做。
  • 我知道,这不是编写 js 的正确方法,但我们正在进行一些数据库更改,因此我不得不编写一个。这只是一次使用(希望如此),不会在生产中使用。

标签: node.js asynchronous async-await synchronous


【解决方案1】:

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

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

【讨论】:

  • 我在您回答之前就开始使用 async.EachSeries,它符合我的目的。将其标记为答案,以便任何处于类似情况的人都可以找到它。
  • @arjun kori 如果您使用异步,那么使用回调它将作为同步工作。前任。如果你想在做一些操作后传递一个值,那么你可以使用 async.waterfall。
  • @bhaurao 我已经这样做了,但是由于我的声誉低于 15,因此没有公开显示!
【解决方案2】:

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

【讨论】:

  • 是的,我已经在研究异步,但是 .series 或 .waterfall 都没有减轻痛苦。我正在研究 .foreach,感觉 foreach 可能会起作用。会在这里更新!!
【解决方案3】:

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

如果您想了解有关这些概念的更多信息:您可以查看此tutorial for asyncthis one for promises

【讨论】:

  • 由于我的代码执行环境的一些限制,我不能使用 Promise。它是一个非生产代码,只会在满月时使用一次。我的生产代码使用了 Promise。
猜你喜欢
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2020-02-08
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多