es6 参数注入问题

class loginCtrl {
    constructor(http) {
        [this.http, this.name] = [http, 'login'];
    }

    login() {
        console.log(this.http);
        console.log(this.name);
    }
}
loginCtrl.$inject = ['http'];

let a = new loginCtrl();
a.login();

clipboard.png
这样调用之后http是undefined,但是通过点击事件,即可以打印出来。

clipboard.png
这是怎么回事,注入http那里用的是angular的。
http代码如下:

class http {
    constructor($http) {
        this.$http = $http;
        this.options = {
            headers: {
                'Content-type': 'application/json;charset=utf-8',
                'accessToken': 2332
            }
        }
    }
    get(data, url, cb) {
        let gets = {method: 'GET', params: data, url: url}
        Object.assign(gets, this.options)
        this.$http(gets).then(function (data) {
            console.log('success');
            cb(data);
        })
    }
}

http.$inject = ['$http'];

export default angular.module('http', [])
    .service('http', http)
    .name;
阅读 3.3k
2 个回答

let a = new loginCtrl(http)

你没有给http到constructor

因为你注入是异步方法,其他是同步方法,同步方法会从上到下执行,但是遇到异步方法的地方会新开一个线程去执行,也就是你注入http的这个方法和你的login方法并行,直接运行,当你的login线程运行完后,http注入这个线程还没来得及返回值,就打印出来了。但是添加了点击事件后,就开了个事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,这样点击后就收到了http注入后返回的值,大概就是这样。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题