gpt4 book ai didi

javascript - 从回调函数返回

转载 作者:行者123 更新时间:2023-11-29 18:13:25 24 4
gpt4 key购买 nike

我正在为 Webkit 存储 API(this API 的新版本)编写一个基本包装器供我使用。我目前的问题是 queryUsageAndQuota() 函数。

我对那个特定函数的包装最初是这样的:

self.pers.getQuota = function() {
self.pers.queryUsageAndQuota(function(usage,quota) {
return quota;
});
}
// self is a reference to the top level of this 'wrapper'

因此,我会调用 var quota = self.pers.getQuota(); 并返回配额。

失败后,我看了看this question并对其进行了更改,因此我改用了用户定义的回调。现在的功能是这样的:

self.pers.getQuota = function(callback) {
self.pers.queryUsageAndQuota(function(usage,quota) {
callback.call(quota);
});
}

但是,执行这一行:

self.pers.getQuota(function(quota) {
console.log(quota);
});

在日志中显示 undefined。我不明白为什么,因为当我执行底层函数 navigator.webkitPersistentStorage.queryUsageAndQuota() 时,我从中得到了正确的数字。

最佳答案

.call 并不像您想象的那样工作。而是执行 callback.call(null, quota)

Function.prototype.call(apply 也类似)的实际签名是

 Function.prototype.call(valueOfThis, valueOfParam1, valueOfParam2, ...);

这也是为什么我经常说 javascript 中的 this 关键字是愚蠢的,你应该避免使用它。它只是与所有其他参数一样的另一个参数,您只是不必为它指定名称。当 Netscape 要求这种基于 Scheme 的语言看起来像 Java 时,这是 javascript 创建的遗迹。

顺便说一下,您可以在这里使用第三种方法调用方法。简单

callback(quota);

然而,这有一个副作用,那就是让 javascript 猜测您想要的 this 是什么(在本例中是全局 window 对象)。只要您不使用 this,简单的语法就可以很好地工作。

如果您实际上真的想要返回一个值而不是传递回调,请查看 javascript promises。在不知道您所处的环境和使用的库的情况下,我无法告诉您使用哪个,但是 jQuery has a good implementation in the Deferred object

关于javascript - 从回调函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25331476/

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