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にアクセスする必要があります。deviceTokenpushNotification.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

トークンをグローバルに割り当てていて、それを使用しようとしたときにその undefined が見つかった場合、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 に答える