2014-04-13 12 views
6

के माध्यम से फायरबेस लेनदेन मुझे समेकन को संभालने का एक अच्छा तरीका होने के लिए लेनदेन (https://www.firebase.com/docs/transactions.html) मिलते हैं, हालांकि ऐसा लगता है कि वे केवल ग्राहकों से ही किए जा सकते हैं।आरईएसटी एपीआई

जिस तरह से हम फायरबेस का उपयोग करते हैं वह मुख्य रूप से हमारे सर्वर से डेटा लिखकर और ग्राहकों पर देखकर होता है। आरईएसटी एपीआई के माध्यम से डेटा लिखते समय आशावादी समरूपता मॉडल प्राप्त करने का कोई तरीका है?

धन्यवाद!

+0

हाय मार्टिन, आप उस कामकाज की कल्पना कैसे करते हैं? ध्यान रखें कि लेन-देन आगे और आगे की चर्चा पर भरोसा करते हैं जहां ग्राहक डेटा सेट करने का प्रयास करता रहता है, सर्वर समवर्ती परिवर्तनों के साथ जवाब देता रहता है, और अंततः वे मूल्य पर व्यवस्थित होते हैं या हार मानते हैं। – Kato

+0

हाय काटो, निश्चित रूप से, मैं एक ही चर्चा सर्वर-साइड को लागू करने की कोशिश कर रहा हूं। मैं जीईटी अनुरोध के माध्यम से फायरबेस के भीतर किसी ऑब्जेक्ट की वर्तमान स्थिति प्राप्त कर सकता हूं और फिर इसे PUT के माध्यम से बदल सकता हूं, लेकिन क्या यह जानने के लिए कोई तरीका है कि उस ऑब्जेक्ट को इस दौरान संशोधित किया गया है या नहीं? –

+0

मुझे ऐसा नहीं लगता है; जो आरईएसटी के माध्यम से लेनदेन की कोशिश कर परेशानी का हिस्सा है। मुझे लगता है कि हम एक ऐसे समाधान को फेंक सकते हैं जो आसानी से लेनदेन को अनुकरण करता है। मुझे जवाब देने दो। – Kato

उत्तर

13

आप लेन-देन के समान तरीके से लिखने के लिए काम करने के लिए एक अद्यतन काउंटर का उपयोग कर सकते हैं। (मैं नीचे कुछ छद्म कोड का उपयोग करने जा रहा हूं; इसके लिए खेद है, लेकिन मैं एक उदाहरण के लिए एक पूर्ण आरईएसटी एपीआई लिखना नहीं चाहता था।)

उदाहरण के लिए, यदि मेरे पास ऐसा कोई ऑब्जेक्ट है:

{ 
    total: 100, 
    update_counter: 0 
} 

और इस तरह एक लिखने नियम:

{ 
    ".write": "newData.hasChild('update_counter')", 
    "update_counter": { 
     ".validate": "newData.val() === data.val()+1" 
    } 
} 

मैं अब बस प्रत्येक ऑपरेशन के साथ update_counter में पास करके समवर्ती संशोधनों पर रोक सकता है।

var url = 'https://<INSTANCE>.firebaseio.com/path/to/data.json'; 
addToTotal(url, 25, function(data) { 
    console.log('new total is '+data.total); 
}); 

function addToTotal(url, amount, next) { 
    getCurrentValue(url, function(in) { 
     var data = { total: in.total+amount, update_counter: in.update_counter+1 }; 
     setCurrentValue(ref, data, next, addToTotal.bind(null, ref, amount, next)); 
    }); 
} 

function getCurrentValue(url, next) { 
    // var data = (results of GET request to the URL) 
    next(data); 
} 

function setCurrentValue(url, data, next, retryMethod) { 
    // set the data with a PUT request to the URL 
    // if the PUT fails with 403 (permission denied) then 
    // we assume there was a concurrent edit and we need 
    // to try our pseudo-transaction again 
    // we have to make some assumptions that permission_denied does not 
    // occur for any other reasons, so we might want some extra checking, fallbacks, 
    // or a max number of retries here 
    // var statusCode = (server's response code to PUT request) 
    if(statusCode === 403) { 
     retryMethod(); 
    } 
    else { 
     next(data); 
    } 
} 
+0

यह बहुत अपरिवर्तनीय दिखता है, बहुत बहुत धन्यवाद! मैं इसे लागू करने की कोशिश करूंगा और आपको किसी भी परेशानी के बारे में बता दूंगा। –

+0

वस्तुओं को अद्यतन करने के लिए पूरी तरह से काम करता है। क्या हटाने के लिए एक समान चीज को लागू करना संभव है? –

+0

@ मार्टिन स्वावा यह करना वास्तव में संभव नहीं है, मुझे लगता है, क्योंकि आप एक डेली के साथ डेटा पास नहीं करते हैं। मुझे नहीं लगता कि ज्यादातर सिस्टम इस बारे में परवाह करते हैं, क्योंकि वे मानते हैं कि क्या आप डेलेटी कहते हैं, तो आप वास्तव में समाप्त हो जाते हैं, और इससे पहले कि आप सही कुंजी/यूआरएल का संदर्भ दे रहे हों, उस पर ध्यान न दें। –

2

जांच Firebase-लेन-देन परियोजना: उदाहरण के लिए: https://github.com/vacuumlabs/firebase-transactions

मुझे विश्वास है, यह आपके मामले के लिए काफी आसान हो सकता है, खासकर यदि आप सर्वर से लेखन का एक बहुत करते हैं।

(अस्वीकरण: मैं लेखकों में से एक हूँ)

3

FYI करें, Firebase रीयलटाइम डाटाबेस आधिकारिक तौर पर इस अब समर्थन करता है।

अधिक जानकारी के लिए blog और docs पढ़ें।

+0

@ मार्टिन स्वावा हां, वे करते हैं और मैं इसका उपयोग कर रहा हूं और यह काम करता है। – bibscy

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