2014-11-02 4 views
0

Я работаю над получением информации jsonp с страницы, и я хочу использовать различные функции для этой информации. Информация возвращается хорошо, но я не могу найти способ сделать ее доступной вне функции. Я знаю, что это связано с закрытием и функциональностью, но я не могу понять, как заставить ее работать, какие-либо идеи?Переменный контент вне метода

Я могу добиться того, что я пытаюсь сделать в остальной части сценария, сделав несколько вызовов в json-файле, но я предполагаю, что лучше просто запросить json один раз и вставить его в переменную и попытаться сработать ? Я относительно новичок в этой настройке, поэтому любые предложения были оценены.

Эффективно из-за кода, приведенного ниже, я хочу получить доступную переменную allMatches за пределами метода getData после ее запуска.

Спасибо за ваше время, вся помощь очень ценится.

var AppInfo = { 
    getData : function(){ 

       var responseJsonVar; 
       var callbackName, script, newInfo, mydata,allMatches; 
       // Get a random name for the callback 
       callbackName = "checkGames" + new Date().getTime() + Math.floor(Math.random() * 10000); 

       // create the jsonP script call on the page 
       script = document.createElement('script'); 
       script.src = "http://www.hookhockey.com/index.php/temp-gillian/?callback=" + callbackName; 
       document.documentElement.appendChild(script); 

       // call the json 
       window[callbackName] = function(data) { 

        responseJsonVar = data; // this is the info back from the json file 

        //the filtered data source from json 
        var allMatches = responseJsonVar["matches"]; 

        console.dir('allMatches inside the function: ' + allMatches); //this comes back fine 



         // Remove our callback ('delete' with 'window properties fails on some versions of IE, so we fall back to setting the property to 'undefined' if that happens) 
         try { 
          delete window[callbackName]; 
         } 
         catch (e) { 
          window[callbackName] = undefined; 
         } 

     //I've tried putting a return value (return allMatches) in here and then calling window[callbackName]() outside of the function but I get undefined for matches 

       }; // end window[callbackName] function 

    //this is what I think I should be doing to get the info out on its own 
    console.dir('allMatches OUTSIDE the function: ' + allMatches); //this doesn't come back 'allMatches is not defined' 


    } //end getdata method 

} //end AppInfo 


AppInfo.getData(); 

ответ

1

Вы можете просто создать свойство на вашем AppInfo объекте под названием allMatches и установить это свойство, когда данные поступают обратно из JSONP вызова:

var AppInfo = { 
    allMatches: null, // NEW PROPERTY TO HOLD RETURNED DATA 
    confirmDataAvailableOutsideFunction: function() { // NEW FUNCTION TO VERIFY DATA AVAILABLE OUTSIDE getData() 
    console.dir('AppInfo.allMatches OUTSIDE the function AFTER jsonp call executes: ' + AppInfo.allMatches); //this doesn't come back 'allMatches is not defined' 
    }, 
    getData: function() { 

    var responseJsonVar; 
    var callbackName, script, newInfo, mydata, allMatches; 
    // Get a random name for the callback 
    callbackName = "checkGames" + new Date().getTime() + Math.floor(Math.random() * 10000); 

    // create the jsonP script call on the page 
    script = document.createElement('script'); 
    script.src = "http://www.hookhockey.com/index.php/temp-gillian/?callback=" + callbackName; 
    document.documentElement.appendChild(script); 

    // call the json 
    window[callbackName] = function (data) { 

     responseJsonVar = data; // this is the info back from the json file 

     //the filtered data source from json 
     AppInfo.allMatches = responseJsonVar["matches"]; // store data in allMatches property 

     console.dir('allMatches inside the function: ' + AppInfo.allMatches); //this comes back fine 
     AppInfo.confirmDataAvailableOutsideFunction(); // call test method to verify allMatches property is set 

     // Remove our callback ('delete' with 'window properties fails on some versions of IE, so we fall back to setting the property to 'undefined' if that happens) 
     try { 
     delete window[callbackName]; 
     } 
     catch (e) { 
     window[callbackName] = undefined; 
     } 

     //I've tried putting a return value (return allMatches) in here and then calling window[callbackName]() outside of the function but I get undefined for matches 

    }; // end window[callbackName] function 

    //this is what I think I should be doing to get the info out on its own 
    console.dir('AppInfo.allMatches OUTSIDE the function BEFORE jsonp call executes: ' + AppInfo.allMatches); //this doesn't come back 'allMatches is not defined' 


    } //end getdata method 

}; //end AppInfo 

AppInfo.getData(); 

Следует заметить, что я изменил текст своего второго console.dir, чтобы указать, что он работает до звонок jsonp возвращает, и поэтому свойство allMatches по-прежнему null в этом пункте.

Вот почему, после реализации предложения @ PETER-B, чтобы использовать window.allMatches вместо локальной переменной allMatches, window.allMatches ВНЕ функции была undefined --Вы проверяли его, прежде чем он был установлен.

Решение peter-b будет работать нормально, при условии, что вы не пытались получить доступ к window.allMatches, прежде чем он был установлен. Поэтому, если вам нужны данные, хранящиеся в глобальной переменной, вы можете использовать его метод; если вы хотите, чтобы он был сохранен на вашем объекте AppInfo, вы можете использовать мой.

В качестве альтернативы, вы можете обернуть все в непосредственной функции, имеющей allMatches в качестве локальной переменной:

(function() { 
    var allMatches = null; 

    var AppInfo = { 
    getData: function (dataReadyCallback) { 

     /* ... */ 
     allMatches = responseJsonVar["matches"]; 
     dataReadyCallback(); 
     /* ... */ 

    } 
    }; 

    AppInfo.getData(allMatchesReady); 

    function allMatchesReady() { 
    console.dir('allMatches OUTSIDE the function AFTER jsonp call executes: ' + allMatches); 
    } 

}()); 
+0

отлично, спасибо за эту информацию, очень ценим! –

+0

Добро пожаловать! Рад помочь. – MikeJ

0

Один простой способ получить то, что вы хотите, чтобы присвоить allMatches как свойство window, что делает его доступным везде. Заменить

var allMatches = responseJsonVar["matches"]; 

с

window.allMatches = responseJsonVar["matches"]; 

, а затем получить доступ к нему позже с помощью window.allMatches.

+0

эй, спасибо за предложение .. Я заменил как это было предложено, а затем изменил мой журнал консоли на консоль. log ('allMatches OUTSIDE function:' + window.allMatches); но я боюсь, что теперь я получаю «allMatches OUTSIDE the function: undefined» в консоли. –

Смежные вопросы