te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>Static async function in JavaScript class - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Static async function in JavaScript class - Stack Overflow

programmeradmin3浏览0评论

I'm having trouble with a static async method on a JavaScript class. If I remove the static keyword it works fine to call within the class but then I won't be able to call it by using the class.

My desired oute is to use the exist method on the class itself using User.exist(email) and on an instance of the class, e.g. foo.exist(email).

Where do I think wrong?

const userEmails = []

class User {
  constructor(fields) {
   this.email = fields.email;
   this.name = fields.name;
  }

  static async exist(email) {
    return setTimeout(function() {
      return userEmails.includes(email)
    }, 2000)
  }

  async storeEmail() {
    let userExist = await this.exist(this.email)

    if (userExist) {
      console.log('User exist')
    } else {
      users.push(this.email)
      console.log(userEmails)
    }
  }
};

let foo = new User({email: '[email protected]', name: 'Foo Bar'})

foo.storeEmail()           // this.exist is not a function
User.exist('[email protected]')  // Works when used inside async function with await

I'm having trouble with a static async method on a JavaScript class. If I remove the static keyword it works fine to call within the class but then I won't be able to call it by using the class.

My desired oute is to use the exist method on the class itself using User.exist(email) and on an instance of the class, e.g. foo.exist(email).

Where do I think wrong?

const userEmails = []

class User {
  constructor(fields) {
   this.email = fields.email;
   this.name = fields.name;
  }

  static async exist(email) {
    return setTimeout(function() {
      return userEmails.includes(email)
    }, 2000)
  }

  async storeEmail() {
    let userExist = await this.exist(this.email)

    if (userExist) {
      console.log('User exist')
    } else {
      users.push(this.email)
      console.log(userEmails)
    }
  }
};

let foo = new User({email: '[email protected]', name: 'Foo Bar'})

foo.storeEmail()           // this.exist is not a function
User.exist('[email protected]')  // Works when used inside async function with await
Share Improve this question edited Jan 22, 2024 at 22:44 Bret Cameron 4731 gold badge5 silver badges21 bronze badges asked Mar 25, 2021 at 9:20 Patrick BenderPatrick Bender 4671 gold badge5 silver badges18 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 7

When you define the method of a class as static member, it is not available on instance using this keyword. You can directly call it using the class name inside class functions like User.exist(this.email)

const userEmails = []

class User {
  constructor(fields) {
   this.email = fields.email;
   this.name = fields.name;
  }

  static async exist(email) {
    return setTimeout(function() {
      return userEmails.includes(email)
    }, 2000)
  }

  async storeEmail() {
    let userExist = await User.exist(this.email)

    if (userExist) {
      console.log('User exist')
    } else {
      users.push(this.email)
      console.log(userEmails)
    }
  }
};

let foo = new User({email: '[email protected]', name: 'Foo Bar'})

foo.storeEmail()           // this.exist is not a function
User.exist('[email protected]')  // Works when used inside async function with 

You need to call your static function in a static context, so User.exist() instead of this.exist():

const userEmails = []

class User {
  constructor(fields) {
   this.email = fields.email;
   this.name = fields.name;
  }

  static async exist(email) {
    return setTimeout(function() {
      return userEmails.includes(email)
    }, 2000)
  }

  async storeEmail() {
    let userExist = await User.exist(this.email)

    if (userExist) {
      console.log('User exist')
    } else {
      users.push(this.email)
      console.log(userEmails)
    }
  }
};

let foo = new User({email: '[email protected]', name: 'Foo Bar'})

foo.storeEmail();          // OK
User.exist('[email protected]'); // OK

The other answers here work, but are not good. Referencing the class name from within the class is something you shouldn't do. What if the class name changes? what if you are working with inheritance? It will be broken. use this.constructor to get to the the static methods on a given instance

class User {
  constructor(fields) {
   this.email = fields.email;
   this.name = fields.name;
  }

  static async exist(email) {
    return setTimeout(function() {
      return userEmails.includes(email)
    }, 2000)
  }

  async storeEmail() {
    let userExist = await this.constructor.exist(this.email)

    if (userExist) {
      console.log('User exist')
    } else {
      users.push(this.email)
      console.log(userEmails)
    }
  }
};
发布评论

评论列表(0)

  1. 暂无评论