从回调函数返回

时间:2014-08-15 17:48:45

标签: javascript storage

我正在编写Webkit Storage 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()时,我得到了正确的数字。

2 个答案:

答案 0 :(得分:3)

.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

答案 1 :(得分:1)

尝试

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

self.pers.getQuota = function(callback) {
    self.pers.queryUsageAndQuota(function(usage,quota) {
        callback.call(/* an object as 'this'*/, quota);
    });
}

Function.prototype.call()

self.pers.getQuota = function(callback) {
    self.pers.queryUsageAndQuota(function(usage,quota) {
        callback.apply(/* an object as 'this'*/, [quota]);
    });
}

Function.prototype.apply()