আমার একটি অ্যাঙ্গুলারজেএস পরিষেবা রয়েছে যা আমি কিছু অ্যাসিঙ্ক্রোনাস ডেটা দিয়ে শুরু করতে চাই। এটার মতো কিছু:
myModule.service('MyService', function($http) {
var myData = null;
$http.get('data.json').success(function (data) {
myData = data;
});
return {
setData: function (data) {
myData = data;
},
doStuff: function () {
return myData.getSomeData();
}
};
});
স্পষ্টতই এটি কাজ করবে না কারণ যদি কিছু ফিরে আসার doStuff()
আগে কল করার চেষ্টা করে তবে myData
আমি নাল পয়েন্টার ব্যতিক্রম পাব। যতদূর আমি এখানে জিজ্ঞাসা করা অন্যান্য প্রশ্নগুলির কয়েকটি পড়তে বলতে পারি এবং এখানে আমার কাছে কয়েকটি বিকল্প রয়েছে তবে এগুলির কোনওটিই খুব পরিষ্কার মনে হয় না (সম্ভবত আমি কিছু মিস করছি):
"রান" দিয়ে সেটআপ পরিষেবা
আমার অ্যাপটি সেট আপ করার সময় এটি করুন:
myApp.run(function ($http, MyService) {
$http.get('data.json').success(function (data) {
MyService.setData(data);
});
});
তারপরে আমার পরিষেবাটি দেখতে এই রকম হবে:
myModule.service('MyService', function() {
var myData = null;
return {
setData: function (data) {
myData = data;
},
doStuff: function () {
return myData.getSomeData();
}
};
});
এটি কিছু সময় কাজ করে তবে অ্যাসিনক্রোনাস ডেটা যদি সবকিছু শুরু করার চেয়ে বেশি সময় নেয় তবে আমি কল করলে নাল পয়েন্টার ব্যতিক্রম পাই I doStuff()
প্রতিশ্রুতি বস্তু ব্যবহার করুন
এটি সম্ভবত কাজ করবে। আমি যেখানেই মাই সার্ভিসকে কল করি তার একমাত্র নেতিবাচক দিকটি আমাকে জানতে হবে যে ডস্ট স্টাফ () একটি প্রতিশ্রুতি দেয় এবং সমস্ত কোড আমাদের then
কাছে প্রতিশ্রুতির সাথে যোগাযোগ করতে হবে । আমি বরং আমার অ্যাপ্লিকেশনটি লোড করার আগে আমার ডেটা ফিরে না আসা পর্যন্ত অপেক্ষা করব।
ম্যানুয়াল বুটস্ট্র্যাপ
angular.element(document).ready(function() {
$.getJSON("data.json", function (data) {
// can't initialize the data here because the service doesn't exist yet
angular.bootstrap(document);
// too late to initialize here because something may have already
// tried to call doStuff() and would have got a null pointer exception
});
});
গ্লোবাল জাভাস্ক্রিপ্ট ভার আমি আমার জেএসএনকে সরাসরি বৈশ্বিক জাভাস্ক্রিপ্ট ভেরিয়েবলে প্রেরণ করতে পারি:
এইচটিএমএল:
<script type="text/javascript" src="data.js"></script>
data.js:
var dataForMyService = {
// myData here
};
তারপরে এটি আরম্ভ করার সময় উপলব্ধ হবে MyService
:
myModule.service('MyService', function() {
var myData = dataForMyService;
return {
doStuff: function () {
return myData.getSomeData();
}
};
});
এটি খুব কার্যকর হবে, তবে তারপরে আমার কাছে একটি গ্লোবাল জাভাস্ক্রিপ্ট ভেরিয়েবল রয়েছে যা দুর্গন্ধযুক্ত।
এগুলি কি আমার একমাত্র বিকল্প? এই বিকল্পগুলির মধ্যে একটি কি অন্যদের চেয়ে ভাল? আমি জানি এটি একটি দীর্ঘ দীর্ঘ প্রশ্ন, তবে আমি এটি দেখাতে চেয়েছিলাম যে আমি আমার সমস্ত বিকল্প অন্বেষণ করার চেষ্টা করেছি। কোন গাইডেন্স প্রশংসিত হবে।
$http
, তারপরে কোনও পরিষেবাতে ডেটা সংরক্ষণ করতে, তারপরে কোনও অ্যাপ্লিকেশন বুটস্ট্র্যাপ করে অবিচ্ছিন্নভাবে কোডের মধ্য দিয়ে চলে ।