使用async.js系列中的GET方法和CouchDB操作进行循环不会执行多次

保罗

我正在使用async.js系列进行连续的http get调用,所有这些都在for循环内。首先,我从API查询中检索了许多结果,然后对每个结果运行另一个查询。结果存储在数组中,然后保存到CouchDB数据库。因为结果的数量限制为200,所以我必须多次执行此操作(因此for循环)。该代码的基本结构如下(下面是完整代码)

for (...) {
  async.series(
     [
       function(){ http get method }, 
       function (){ async.eachSeries(){ http get method }, callback function }
     ],
     function(){ database operations }
  );//end series
}//end for loop

我的问题是循环仅执行一次。循环中的所有内容均按预期工作,并且数据已正确保存到数据库中-但我不知道为什么循环不会再次运行。我知道如果在异步回调函数中放置方法调用,它将运行良好,所以也许我缺少有关异步工作原理的信息。我认为for循环应该在调用堆栈上,所以当异步完成后,循环应该继续下去,但是显然不是这样。

完整代码:

for (var retstart = 0; retstart < elsvr_count; retstart += elsvr_retSize) { 

var elsvr_resultChunk;

async.series(
    [ 
        function(callback){

            var elsvr_Query = String(elsvr_baseURL) + "apiKey="+ String(elsvr_apiKey) + "&query=af-id(" + String(elsvr_ID) + ")&httpAccept=application/" + String(elsvr_resultType) + "&count=" + String(elsvr_retSize) + "&view=";

            $.get(elsvr_Query, function(result) {

                elsvr_count = parseInt(result["search-results"]["opensearch:totalResults"]); //the number of results
                console.log("count set at " + elsvr_count);
                elsvr_resultChunk = result["search-results"]["entry"]; //the current chunk of the total result, the size of which elsvr_retSize
                callback(null);
            });//end get

        },

        function(callback){

            async.eachSeries(elsvr_resultChunk, function(item, callback){
                var docQuery = item["prism:url"] + "?apiKey=" + String(elsvr_apiKey) + "&httpAccept=application/" + String(elsvr_resultType);

                $.ajax({
                    url: docQuery,
                    type: 'GET',
                    dataType: 'json',
                    success: function(result){
                        elsvr_results.push(result);
                        return callback(null);
                    },
                    error: function(err){
                        console.log("error returned: "+err.statusText);
                        elsvr_errors = elsvr_errors+1;
                        return callback(null);
                    }
                });
            },

            function(err, results) {
                if (err) console.log("error: " + err);
                else
                    callback(null, elsvr_results);
            });

        }
    ],

    //callback from async.series
    function (err, results){
        if (err)
            console.log("ERROR: " + JSON.stringify(err));
        else {
            db.getDoc('unprocessed', function(er, doc){
                if (er) throw new Error(JSON.stringify(er));

                if (doc.elsvr != undefined)
                    doc.elsvr = _.extend(results[1], doc.elsvr);
                else
                    doc.elsvr = results[1];

                db.saveDoc('unprocessed', doc, function(er, ok) {
                    if (er) throw new Error(JSON.stringify(er));
                    console.log('saved a chunk to the database: ' + db.name);
                });
            });
        }
     }
);//end async.series
}//end for loop
保罗

好的,我终于解决了。事实证明,循环不是同步执行的,并且由于我在异步系列中更新了循环条件(elsvr_count),因此在实际设置条件之前,循环已完成。但是,这不是唯一的问题-如果我删除了该条件更新,并简单地将elsvr_count设置为循环外的一个高数字,则该循环仍会在异步系列返回之前异步运行。

我将发布我的解决方案,以防其他人遇到类似的问题:基本上,如下所示,用async.whilst循环替换for循环

        async.whilst(function() { return retstart < elsvr_count; }, 
            function(callback) {
                var elsvr_resultChunk;
                async.series(

                      //...
                      //same stuff as above goes here
                      //...

                      //save the document to the database
                      db.saveDoc('unprocessed', doc, function(er, ok) {
                          if (er) throw new Error(JSON.stringify(er));
                          retstart += elsvr_retSize; //<-- to replace the increment of the for loop
                          callback(null); //<-- important     
                      });

                      //...
                      //...
                );//end async.series
            },

           //callback for the whilst loop. this will be called once the condition is no longer met (retstart < elsvr_retSize)
           function(err) {
               //do stuff in here
           }
        );//end async.whilst

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用node.js和async.js:系列执行顺序错误?

来自分类Dev

使用@Async嵌套@Transactional方法

来自分类Dev

使用Async,HtmlAgilityPack和XPath进行解析

来自分类Dev

使用LazyCache进行Moq和Async的乐趣

来自分类Dev

使用async.forEach和异步操作的Node.js

来自分类Dev

如何在 Node.js 中使用“async/await”和“promises”进行同步执行?

来自分类Dev

无法使用Async DocumentDB操作CreateDocumentAsync的结果

来自分类Dev

Async / Await无法正常使用for循环语句

来自分类Dev

使用async / await运行多个无限循环

来自分类Dev

使用std :: async从线程进行函数调用?

来自分类Dev

使用Async.Parallel进行计划

来自分类Dev

使用 await 和 async 承诺范围

来自分类Dev

在 mongoose.js 中使用 async/await

来自分类Dev

使用 Node js Await/Async 函数

来自分类Dev

使用SpringFrameWork @Async用于返回void的方法

来自分类Dev

使用@Async方法的JUnit回滚事务

来自分类Dev

如何使用async和await实现异步GUI操作?

来自分类Dev

服务参考不会使用Async方法生成WCF服务

来自分类Dev

使用Async / Await vs Promise.all和for循环

来自分类Dev

使用嵌套的async.forEachSeries和async.waterfall控制Lambda Node.js代码的排序

来自分类Dev

使用async.forEach循环在异步函数中覆盖变量

来自分类Dev

Python中的多处理:如何使用回调函数在“ apply_async”和“ map_async”之间实现循环

来自分类Dev

使用async / await进行异步TcpListener的正确方法

来自分类Dev

如何在map函数内部使用async和wait进行顺序执行

来自分类Dev

在Node.js中将Async与Waterfall和Recursion结合使用

来自分类Dev

在使用 Async 和 Await 解析多个方法后运行代码

来自分类Dev

clojure.core.async-使用>!和<!在函数调用中

来自分类Dev

异步使用async和await更新Winforms中的TreeView

来自分类Dev

在React JS中可以使用async / await吗?

Related 相关文章

  1. 1

    使用node.js和async.js:系列执行顺序错误?

  2. 2

    使用@Async嵌套@Transactional方法

  3. 3

    使用Async,HtmlAgilityPack和XPath进行解析

  4. 4

    使用LazyCache进行Moq和Async的乐趣

  5. 5

    使用async.forEach和异步操作的Node.js

  6. 6

    如何在 Node.js 中使用“async/await”和“promises”进行同步执行?

  7. 7

    无法使用Async DocumentDB操作CreateDocumentAsync的结果

  8. 8

    Async / Await无法正常使用for循环语句

  9. 9

    使用async / await运行多个无限循环

  10. 10

    使用std :: async从线程进行函数调用?

  11. 11

    使用Async.Parallel进行计划

  12. 12

    使用 await 和 async 承诺范围

  13. 13

    在 mongoose.js 中使用 async/await

  14. 14

    使用 Node js Await/Async 函数

  15. 15

    使用SpringFrameWork @Async用于返回void的方法

  16. 16

    使用@Async方法的JUnit回滚事务

  17. 17

    如何使用async和await实现异步GUI操作?

  18. 18

    服务参考不会使用Async方法生成WCF服务

  19. 19

    使用Async / Await vs Promise.all和for循环

  20. 20

    使用嵌套的async.forEachSeries和async.waterfall控制Lambda Node.js代码的排序

  21. 21

    使用async.forEach循环在异步函数中覆盖变量

  22. 22

    Python中的多处理:如何使用回调函数在“ apply_async”和“ map_async”之间实现循环

  23. 23

    使用async / await进行异步TcpListener的正确方法

  24. 24

    如何在map函数内部使用async和wait进行顺序执行

  25. 25

    在Node.js中将Async与Waterfall和Recursion结合使用

  26. 26

    在使用 Async 和 Await 解析多个方法后运行代码

  27. 27

    clojure.core.async-使用>!和<!在函数调用中

  28. 28

    异步使用async和await更新Winforms中的TreeView

  29. 29

    在React JS中可以使用async / await吗?

热门标签

归档