我有一个用户模型:

export class User extends Serializable{
  id: string;
  first_name: string;
  middle_name: string;
  last_name: string;
  email: string;
  image_url: string;

  // mykeyStore
  static store:StoreDatabase = new StoreDatabase("mykeyStore");


... More code...

该类的loadProfile()函数返回一个promise。
loadProfile():Dexie.Promise<any>{
    let promise = User.store.get('user')
      .then(
        tuple => {
          // Extract User Data from tuple
          let user_data = tuple && tuple.value

          // Fill User attribute for Tuple's value
          for (var attr in user_data) {
            this[attr] = user_data[attr];
          }
        });

    return promise;
}

如何构造我的代码,以便调用loadProfile并不会始终运行then(如果已解决),方法是调用以下命令:
let user = new User();
user.loadProfile().then( () =>
   console.log(user.first_name)
);

最佳答案

每次您调用user.loadProfile()时,都会创建一个新的Promise。因此,.then()中的代码将始终运行。

如果要避免多次加载属性,可以将函数更改为:

loadProfile():Dexie.Promise<any>{
    if (this.promise) return this.promise
    this.promise = User.store.get('user')
      .then(
        tuple => {
          // Extract User Data from tuple
          let user_data = tuple && tuple.value

          // Fill User attribute for Tuple's value
          for (var attr in user_data) {
            this[attr] = user_data[attr];
          }
        });

    return this.promise;
}

然后,如果在加载user.loadProfile()时调用它,那么.then()中的代码将立即执行。

09-30 16:25