js循环async调用

async.js loop around the async call

本文关键字:调用 async 循环 js      更新时间:2023-09-26

在模型保存到数据库之前,我生成一个唯一的id。我调用一个方法来生成一个随机唯一的id然后检查这个id是否可用。这里是我使用的while循环,但它永远不会跳出while循环:

beforeValidation: function(values, next) {
var counter = 0;
var slug = SlugService.generate_slug();
console.log(counter + ":" + slug);
async.whilst(
  function () { return values.slug === undefined && counter <= 10; },
  function (callback) {
    counter++;
    Lists.findOne({slug: slug}).exec(function(err, list) {
      if (list === undefined) values.slug = slug;
      slug = SlugService.generate_slug();
      console.log(counter + ":" + slug);
    });
  },
  function (err) {
    console.log("err");
    values.slug = slug;
  }
  );
next();

}

我正在使用异步库,但它似乎不工作。它只调用next();

我还创建了一个Service类,并在那里添加了这个方法,但这似乎也不起作用:

function checkSlug(method, counter) {
  slug = SlugService.generate_slug();
  method({ slug: slug }).exec(function(err, list) {
    if (list !== undefined && counter <= 10) {
      counter++;
      checkSlug();
    }
  });
}

我更愿意让选项# 2工作,这样我就可以在我所有的模型中共享它。

你的async函数有不同的错误。

1)。你的函数中没有回调函数(参见:https://github.com/caolan/async#whilst)2.) 你在async完成之前调用了风帆回调

试试这个:

beforeValidation: function(values, next) {
  var slug = "";
  async.whilst(
    function check_slug() { return values.slug === undefined },
    function generate_slug(callback) {
      slug = SlugService.generate_slug();
      Lists.findOne({slug: slug}).exec(function(err, result) {
        if (err) {
          return callback(err);
        }
        if (result === undefined){
          values.slug = slug;
        } 
        callback();
    });
  },
  function (err) {
    if(err){
      return console.log(err);
    }
    next();
  });
}