如何使用异步模块

时间:2015-07-22 09:55:12

标签: javascript node.js asynchronous

我正在使用google-spreadsheet模块阅读多个Google文档。这涉及循环我保存在json文件中的每个模块的所有凭据,然后拉动电子表格。因此,如果我的json文件中有10个电子表格凭据,我将需要在循环内调用具有这些详细信息的函数10次。

然后我将保存这些电子表格中的信息。我需要异步执行此操作。我怎样才能实现这一点,也许使用异步模块?我试图了解这个模块的队列方面,但对它没有多大意义。

 for (var i = 0; i < sheets.length; i++) {

    // All of the below could be put in a separate function that needs to be run asynchronously 

    var sheetID=sheets[i]
    // spreadsheet key is the long id in the sheets URL
    var doc = new GoogleSpreadsheet(sheetID);

    doc.useServiceAccountAuth(creds, function(err) {
      if (err) {
        console.log(err);
        return
      }
      doc.getInfo(function(err, info) {
        if (err) {
          return console.log(err);
        }
        sheet = info.worksheets[0];

        sheet.getRows({
         orderby: "marketname",
          start: 0
        }, function(err, row_data) {
          for (var i = 0; i < row_data.length; i++) {
            console.log(row_data[i].marketname);
          }
        })
      })
    })
  }

1 个答案:

答案 0 :(得分:0)

因此,如果我正确理解你想要做的是异步for循环。这意味着你需要一个异步处理(这里是评论中的所有内容),你需要一个接一个地链接在一起。

不使用async lib,您可以像在此示例中那样执行

// Async task
function async(arg, callback) {
  //You put in here what needs to be done with each of your data 
}
// Final task: display or save your data in your files
function final() { console.log('Done', results); }

// A simple async series:
var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];
//Recursive function that will go through your items.
function series(item) {
  //if there is still some item to work with
  if(item) {
    //call your async function with our current item
    async( item, function(result) {
      //push in the results
      results.push(result);
      //Go to the next item.
      return series(items.shift());
    });
  } else {
    //Otherwise this means we're done, and results[] is populated!
    return final();
  }
}
//Start the treatment
series(items.shift());

希望这有帮助!

您可以在this great paper中找到有关某些控制流的更多信息。