1

我有以下代码将我的 iOS 设备注册到我的 APNS 服务器:

pushNotification.registerDevice({
    alert: true,
    badge: true,
    sound: true,
    pw_appid: "***",
    appname: "***"
},

function (status) {
    var deviceToken = status['deviceToken'];
},

function (status) {
    console.warn('failed to register : ' + JSON.stringify(status));
    navigator.notification.alert(JSON.stringify(['failed to register ', status]));
});

这运行onLoad,但我需要访问deviceToken的范围之外pushNotification.registerDevice() function (status)

在这种情况下,是否有可能访问deviceToken函数内部的函数内部,函数外部的函数?

我想我可以通过使用将其设为全局变量,window.deviceToken然后稍后调用它,但它返回未定义。

4

3 回答 3

3

您可以提供deviceToken更广泛的范围:

var deviceToken;

pushNotification.registerDevice({
    alert: true,
    badge: true,
    sound: true,
    pw_appid: "***",
    appname: "***"
},

function(status) {
    deviceToken = status['deviceToken'];
},

function(status) {
    console.warn('failed to register : ' + JSON.stringify(status));
    navigator.notification.alert(JSON.stringify(['failed to register ', status]));
});​
于 2012-10-24T23:13:57.720 回答
2

更改它以创建deviceToken一个全局变量,以便通过直接引用全局范围在外部范围内可用。

function (status) {
    window.deviceToken = status['deviceToken'];
},

如果您只希望它在父范围内,不一定在全局范围内,您可以在所需的父范围内定义它,然后不在您的函数中重新声明它:

var deviceToken;

pushNotification.registerDevice({
    alert: true,
    badge: true,
    sound: true,
    pw_appid: "***",
    appname: "***"
},

function (status) {
    deviceToken = status['deviceToken'];
},

function (status) {
    console.warn('failed to register : ' + JSON.stringify(status));
    navigator.notification.alert(JSON.stringify(['failed to register ', status]));
});
于 2012-10-24T23:13:07.097 回答
2

如果您将令牌分配给全局并在尝试使用它时发现它未定义,您可能会发现它,因为 registerDevice ajax 尚未收到响应。

尝试将你的回调分离成一个单独的函数,并从那里启动任何依赖函数。

function registerSuccess(status) {
  // Store token globally
  token = status["deviceToken"];
  // or pass as an argument
  // call functions that depend on the token
  Foo(token);
  Bar(); // uses global
}

就个人而言,我会尝试将其作为参数传递,以免污染全局命名空间。

于 2012-10-24T23:22:23.333 回答