承诺在node.js中的while循环中返回

时间:2018-08-15 13:38:16

标签: javascript promise

我是node.js编程的新手。 我很困惑异步和等待的工作方式

const async = require('async');

createUser: async (user, myid) => {
let dotill = false;
let userid = null;

const getreturn = async.whilst(
  function testCondition() { return dotill === false;},
  async function increaseCounter(callback) {
    let sr = "AB" + Math.floor(Math.random() * 99999999999) + 10000000000;
    userid = sr.substr(0, 9);
    await knex.raw('select * from userprofile where user_id=?', [userid]).then((res) => {
      console.log(res.rowCount);
      if (res.rowCount === 0) {
        dotill = true;
        callback;
      }else{
        callback;
      }
    });
  },
  function callback(err, n) {
    if (err) {
      return;
    }
    return {"done":true, "userid":userid}
  }
);

console.log(getreturn); 
// getreturn always undefined iam not getting and return 
}

getreturn始终是不确定的,我将如何以上述代码或任何其他方式执行诺言。

1 个答案:

答案 0 :(得分:0)

async / await是链许诺功能的语法糖。不要将其与基于回调的async.js库混淆,也不要在使用Promise时使用后者-它们不能一起工作。不必尝试使用或多或少的适当回调来调用async.whilst,而只需使用简单的while循环即可:

// const async = require('async'); // remove this!

async createUser(user, myid) {
    let dotill = false;
    let userid = null;

    while (!dotill) {
        const sr = "AB" + Math.floor(Math.random() * 99999999999) + 10000000000;
        userid = sr.substr(0, 9);
        const res = await knex.raw('select * from userprofile where user_id=?', [userid]);
        console.log(res.rowCount);
        if (res.rowCount === 0) {
            dotill = true;
        }
    }
    return {"done":true, "userid":userid};
}

(也可以将其简化为while (true) { …; if (…) return }循环,而无需使用该dotill变量)