如何等待来自主 Vue 实例的 ajax 调用?

How to wait for ajax call from main Vue instance?

我目前有 VueJS 组件,可以像这样对 github 进行 ajax 调用:

(Child) 分量

Vue.http.get('user/repos').then((response) => {
    console.log(response);
}, (response) => {
    console.log(response);
});

问题是我首先需要获得访问令牌才能进行此 ajax 调用。此访问令牌存储在数据库中,因此我的主要 Vue 组件正在调用 ajax 以将公共 header 设置为所有 ajax 调用:

Vue 主实例

Vue.http.headers.common['Authorization'] = `token ${this.token}`;

const app = new Vue({
    el: '#app',

    data: {
      token: ''
    },

    created() {
        Vue.http.get('/token').then((response) => {
            this.token = response.data.token;
        }, () => {
            console.log('failed to retrieve the access token for the logged in user.');
        })
    }
});

我如何确定在 运行 来自我的组件的 ajax 调用之前 ajax 调用设置 'Authorization' header成功了吗?

你可以replace/proxyfiy Vue.http.get自己的函数先请求token再做你的请求,大概思路:

!function() 
{ 
  var vue_http_get = Vue.http.get;
  var token = null;

  // patching/proxying Vue.http.get function   
  Vue.http.get = function get() {
    vue_http_get.apply(Vue.http,"path/to/get/token/").then(function(resp){
      token = resp; 
      Vue.http.headers.common['Authorization'] = ...;
      // putting back original Vue.http
      Vue.http = vue_http_get;
      return Vue.http.get(arguments[0]);
    });
  }; 
}();

为任何可能受益的人添加此内容。

  1. 从 API 调用中获取令牌,将其添加到 vuex 状态变量中。

  2. 在子组件中使用 getter 作为计算的 属性 访问相同的内容,或者您​​可以将其作为道具或通过事件总线传递,但两种方式没有使用vuex那么强大。

  3. watch 在 属性 上,并在获得令牌后执行所需的操作。

    // Add this up in the child component
    
       computed: {
         ...mapGetters({
            token: <name-of-the-getter> // token becomes the alias for the computed
         })                            // property.
       },
    
       watch: {
         token () {
           if(this.token) this.someAPICall()// or some other applicable condition
         }
       },
    
       methods: {
         ...mapActions({
           someAPICall: <name-of-the-action>
         })
       }
    
    // ----------------------------------------------
    

Watch 需要更改值,我注意到在操作中进行的提交会导致 watch 触发。因此,如果由于某种原因令牌丢失或过期,您自然无法进行后续请求。

编辑

import store from 'path/to/store'

axios.interceptors.response.use(function (response) {
  // extract the token from the response object
  // save the token to the store for access during subsequent
  // requests.
  return response;
}, function (error) {
  // Do something with response error
  return Promise.reject(error);
});

axios.interceptors.request.use(function (config) {
  // use store getters to access token
  return config;
}, function (error) {
  // Do something with request error
  return Promise.reject(error);
});