15

मुझे लॉग इन करने या यहां तक ​​कि एपीआई को कॉल करने में कोई समस्या नहीं है, मुझे एपीआई कॉलबैक के बाहर प्रतिक्रिया प्राप्त करने में कोई समस्या है। मुझे पता है कि यह असीमित रूप से चलता है इसलिए मैं इसे एक ऐसे फ़ंक्शन में रखना चाहता हूं जो प्रतिक्रिया वापस कर दे। यहाँ मेरा विचारमैं कॉलबैक फ़ंक्शन के बाहर एक FB.api (जेएस एसडीके) प्रतिक्रिया का उपयोग कैसे करूं?

//What I would like to be able to do 
function fbUser(){ 
    FB.api('/me', function(response){ 
     //this logs the correct object 
     console.log(response); 
    }); 
//How do I get the response out here? 
return response; 
} 

है कि मैंने शुरू में एक बार/मुझे एपीआई फ़ंक्शन को कॉल करें और उसके बाद (मैं सिर्फ बैकबोन दृश्य के अंदर प्रतिक्रिया का उपयोग करें) मेरे विचार वस्तुओं के लिए इसके चारों ओर गुजरती हैं और चाहते हैं, उसके आधार पर अन्य एपीआई कॉल करने की जरूरत है। मैं वर्तमान में कुछ बातें कॉलबैक

//What I am doing now, but I lose the ability to pass anything other than the 
//the current response to this function/View 
FB.api('/me', function(response){ 
    var newView = new facebookView({model: response}); 
    }); 

मैं orginally इस कोशिश कर रहा था के अंदर से देखने को फोन करके काम कर रहा है, लेकिन क्योंकि API कॉल अतुल्यकालिक है मैं चीजों को अपरिभाषित जा रहा

//What I started with but had async issues 
var fbResponse; 
FB.api('/me', function(response){ 
    fbResponse = response; 
    }); 
//I would then try and use fbResponse but it would be undefined 

मैं के साथ मुद्दों था जब मैं दूसरा बनाता हूं तो पहली प्रतिक्रिया खो दें। उदाहरण के लिए मेरा पहला एपीआई कॉल उपयोगकर्ता जानकारी प्राप्त करने के लिए/मुझे है। मैं फिर/your-fb-id/फ़ोटो कॉल कर सकता हूं और फ़ोटो प्राप्त कर सकता हूं, लेकिन अगर मैं फोटो एपीआई कॉलबैक के अंदर किसी अन्य फ़ंक्शन पर कॉल करता हूं तो मैं केवल उस प्रतिक्रिया का संदर्भ दे सकता हूं जिसे मैंने मूल/मुझे प्रतिक्रिया खो दी है। अगर मैं कॉलबैक से प्रतिक्रिया प्राप्त कर सकता हूं तो मैं इसे आवश्यकतानुसार पास कर पाऊंगा। मैं समझता हूं कि प्रतिक्रिया केवल कॉलबैक के अंदर मान्य है, इसलिए खाते में यह अतुल्यकालिकता को ध्यान में रखते हुए कॉलबैक के बाहर वैध कैसे बना सकता हूं?

उत्तर

24

ठीक है हर कोई मैंने इसे समझ लिया। यह मुझे एक लंबा समय लगा और कई अलग-अलग पृष्ठों को पढ़ रहा था। मैंने जो कहा वह मैं कॉलबैक और बंद करने के साथ सभी सौदों करना चाहता था। मैं पहले कॉलबैक मुद्दे को कवर करूंगा। चूंकि एफबी.एपीआई फ़ंक्शन असीमित है क्योंकि आप कभी नहीं जानते कि यह कब वापस आएगा। आप जावास्क्रिप्ट को रोक सकते हैं या टाइमर सेट कर सकते हैं, लेकिन ऐसा करने का यह एक भयानक तरीका है। आपको कॉलबैक चाहिए वास्तव में एफबी.एपीआई कॉलबैक का उपयोग कर रहा है। दूसरा पैरामीटर के रूप में अनाम कार्य है। मैंने जो किया वह एक और काम था जिसे एफबीयूसर कहा जाता था और कॉलबैक का इस्तेमाल किया जाता था। यहां मैंने किया है:

function startThis() { 
    var getUser = fbUser(function(model){ 
     console.log(model); 
     startapp(model); 
    }); 
}; 

function fbUser(callback){ 
     FB.api('/me', function(response){ 
       callback(response); 
      }); 
} 

प्रारंभ इस समारोह को सकारात्मक फेसबुक लेख प्रतिक्रिया पर बुलाया जाता है। इसके बाद वह fbUser फ़ंक्शन को कॉल करता है जिसमें कॉलबैक होता है। कॉलबैक एफबी.एपीआई फ़ंक्शन से कॉलबैक देता है। क्योंकि startThis उस कॉलबैक का उपयोग करता है जिसे रिटर्न वैल्यू मॉडल कहा जाता है, दूसरा कोड कॉलबैक रिटर्न तक निष्पादित नहीं होगा। कोई और अपरिभाषित मुद्दे नहीं। ये विचार सिर्फ मेरे विचारों के लिए फेसबुक प्रतिक्रिया प्राप्त करने के लिए रैपर हैं। मैंने अमूर्तता की एक बहुत सी परतें जोड़ दी हैं, लेकिन यदि आप प्रतिक्रिया के आसपास गुजरना चाहते हैं तो यह वही तरीका है।

दूसरा, मैं इस प्रतिक्रिया को किसी अन्य दृश्य पर पास करना चाहता था। उदाहरण के लिए एक दृश्य मूल जानकारी लोड करता है (fbUser से प्रतिक्रिया का उपयोग करके)। अब मैं इसे किसी अन्य दृश्य में पास करना चाहता हूं जो फ़ोटो लोड करता है (मुझे पता है कि यह एमवीसी का सर्वोत्तम प्रथा नहीं है, लेकिन फेसबुक का उपयोग करके मुझे मॉडल पर ज्यादा नियंत्रण नहीं है)। हालांकि मेरी समस्या यह थी कि मैं अगले दृश्य को मूल प्रतिक्रिया पास नहीं कर सका क्योंकि एफबी.एपीआई कॉल this के लिए कॉलबैक फ़ंक्शन के अंदर Window को संदर्भित किया गया है और न कि जिस वस्तु में मैं था। समाधान: बंद। मैं इसे पूरी तरह से समझाऊंगा, लेकिन एक बंद एक फ़ंक्शन के अंदर एक स्थानीय चर है जो अभी भी एक अज्ञात फ़ंक्शन के अंदर एक संदर्भ है। यहाँ मेरी समाधान है जो उदाहरण देकर स्पष्ट करना चाहिए कि मैं क्या बात कर रहा हूँ:

photos: function(){ 
      var This = this; 
      var apiString = '/' + this.model.id + '/photos'; 
      FB.api(apiString, function(response){ 
       loadPhoto(response, 1, This.model); 
      }); 

समारोह loadPhoto एक तस्वीर दृश्य लोड करने में एक आवरण है (मैं जानता हूँ कि रीढ़ की हड्डी मुझे अलग-अलग दृश्यों लोड हो रहा है के साथ मदद कर सकते हैं, लेकिन मैं में एक समस्या से निपटने की गई थी एक वक़्त)। यह फोटो एपीआई कॉल मॉडल के रूप में, ऑफ़सेट के रूप में एक संख्या, और मूल प्रतिक्रिया देता है। इस फ़ंक्शन में पहली पंक्ति इसे स्थानीय चर में सेट करती है।इससे मुझे उस ऑब्जेक्ट को संदर्भित करने के लिए अज्ञात कॉलबैक फ़ंक्शन के अंदर की अनुमति मिलती है जिसे इसे कहा जाता था।

मुझे उम्मीद है कि यह किसी की मदद कर सकता है क्योंकि मैंने इसका समाधान खोजने के लिए बहुत सारे घंटे और परीक्षण का समय बिताया है। अगर आपको पता नहीं है कि कॉलबैक या क्लोजर कैसे काम करते हैं, तो आपको जो जानकारी मिल रही है उसे ढूंढना मुश्किल है।

+0

धन्यवाद! यह वास्तव में एक ही स्थिति में मेरी मदद की! –

संबंधित मुद्दे