gpt4 book ai didi

Javascript 类丢失了对 'this' 的引用(使用 babel)

转载 作者:行者123 更新时间:2023-12-03 05:47:23 28 4
gpt4 key购买 nike

class UrlProvider {
constructor(root) {
this.root = root;
}

getUrl() {
return this.root + "/api/Situations";
}
}


class Repository {
constructor(urlProvider) {
this.urlProvider = urlProvider;
}

getAsync() {
var self = this;
return httpGetAsync(self.urlProvider.getUrl()).then(function(d) {
return d.map(x => new Situation(x));
});
}
}



class PromiseCacher {
constructor(cache, promise) {
var self = this;
self.cache = cache;
self.promise = promise;
}
runAsync() {
var self = this;

return self.promise().then(function (d) {
self.cache.set(d);
return d;
});
}
}

var urlProvider = new UrlProvider(appsettings.url);
var repository = new Repository(urlProvider);
var cache = new Cache();

var promiseCacher = new PromiseCacher(cache, repository.getAsync);

promiseCacher.runAsync()

调试上述代码时,chrome会在存储库的getAsync函数内崩溃,因为self.urlProvider未定义。在存储库中,getAsync 函数“this”指的是 PromiseCacher 的实例,这也是实际调用它的实例。

发生什么事了?

重写

var promiseCacher = new PromiseCacher(cache, ()=> repository.getAsync());

使其按照我的预期工作。

最佳答案

这是因为首先 repository.getAsync 不是一个 promise 。相反,它是一个函数。通过将 repository.getAsync 的引用存储到不同的对象属性,您可以“更改”其 this 值。看一下下面的例子:

var obj = {
a: 42,
func: function(){
return this.a;
}
};

obj.func(); // 42

var b = obj.func;
b(); // undefined

该示例与您的代码相当:

class Repository{
// urlProvider = ...
getAsync (){ /* ... */ }
}

var repo = new Repository(/* ... */);
repo.getAsync(); // works

var cacher = new PromiseCacher(/* ... */);
cacher.promise = repo.getAsync;
cacher.promise(); // does not work

关于Javascript 类丢失了对 'this' 的引用(使用 babel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40289860/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com