JavaScript函数(callback).then(),然后执行回调

时间:2018-09-20 22:25:21

标签: javascript callback

我很难让它开始工作。

我有一个函数getItem

export const getItem = async (key, callback) => {
    value = await Expo.SecureStore.getItemAsync(key).catch((error) => console.log(error));
    callback(value);
}

getItem应该用于获取令牌并将该令牌传递给回调。

现在,我想在这个(简化的)类中使用getItem

export class Post {
    constructor(){
        this.token = false;
    }

    post() {
        console.log('Token: ' + this.token);
        ...
    }

    setToken(token){
        console.log('Set token.');
        this.token = token;
    }

    authorizedPost() {
        getItem('token', this.setToken.bind(this)).then(
            this.post()
        );
    }
}

我像这样使用此类:

let post = new Post();
post.authorizedPost();

这是我得到的输出:

Token: false
Set token.

但是我需要设置令牌,然后,我要调用方法this.post();

由于我是初学者,所以我想原谅一下这个问题。但是我很感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我必须像这样传递一个函数:

class ManagedList < List
  has_many :subscriptions, class_name: "ManagedSubscription"
  has_many :subscribers, though: :subscriptions, class_name: "ManagedSubscriber"
end

class ManagedSubscriber < Subscriber
  has_many :subscriptions, class_name: "ManagedSubscription"
  has_many :lists, through: :subscriptions, class_Name: "ManagedList"
end

class ManagedSubscription < Subscription
  belongs_to :list, class_name: "ManagedList"
  belongs_to :subscriber, class_name: "ManagedSubscriber"

  after_create: :log_sub
  after_destroy: :log_unsub
end

答案 1 :(得分:1)

我知道您并没有真正问过,但是...

代码难于调试的部分原因是因为您在不需要时使用了回调并将它们与promise混合在一起。这是两个不同的异步范例,通常最好分开放置。您可以通过使代码很多更具可读性的方式摆脱代码中的回调。

 Expo.SecureStore.getItemAsync()

返还诺言,所以就返还。

const getItem = (key) => Expo.SecureStore.getItemAsync(key);

然后,在您的方法中,您可以调用then并仅调用您作为回调传递的函数。无需回调或绑定。紧接另一行:

authorizedPost() {
  getItem('token').then(val => {
    this.setToken(val)           // the order is now obvious
    this.post()
  })
  .catch((error) => console.log(error))
}

以下是带有伪造的Expo方法的代码段:

let Expo = {
  SecureStore: {
    getItemAsync() {
      return new Promise((resolve, reject) => setTimeout(() => resolve("someFancyToken"), 1000))
    }
  }
}

class Post {
  constructor() {
    this.token = false;
  }
  post() {
    console.log('Token: ' + this.token);
  }
  setToken(token) {
    console.log('Set token.');
    this.token = token;
  }
  authorizedPost() {
    getItem('token').then(val => {
        this.setToken(val)
        this.post()
      })
      .catch((error) => console.log(error))
  }
}

const getItem = (key) => Expo.SecureStore.getItemAsync(key);

let post = new Post();
post.authorizedPost();