ฉันมีบริการ AngularJS ที่ฉันต้องการเริ่มต้นด้วยข้อมูลอะซิงโครนัสบางส่วน บางสิ่งเช่นนี้
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
จะกลับมาฉันจะได้รับข้อยกเว้นตัวชี้ null เท่าที่ฉันสามารถบอกได้จากการอ่านคำถามอื่น ๆ ที่ถามที่นี่และที่นี่ฉันมีตัวเลือกน้อย แต่ไม่มีคำถามใดที่ดูสะอาดมาก (บางทีฉันอาจขาดอะไรซักอย่าง):
บริการติดตั้งด้วย "run"
เมื่อตั้งค่าแอพของฉันทำสิ่งนี้:
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();
}
};
});
วิธีนี้ใช้งานได้บางเวลา แต่ถ้าข้อมูลแบบอะซิงโครนัสเกิดขึ้นใช้เวลานานกว่าทุกอย่างในการเริ่มต้นฉันจะได้รับข้อยกเว้นตัวชี้ null เมื่อฉันโทร doStuff()
ใช้วัตถุสัญญา
นี่อาจจะใช้ได้ ข้อเสียเพียงอย่างเดียวทุกที่ที่ฉันเรียก MyService ฉันจะต้องรู้ว่า doStuff () คืนสัญญาและรหัสทั้งหมดจะต้องให้เราthen
โต้ตอบกับสัญญา ฉันจะรอจนกว่า myData จะกลับมาก่อนที่จะโหลดแอปพลิเคชันของฉัน
Bootstrap ด้วยตนเอง
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
});
});
Javascript ทั่วโลก Var ฉันสามารถส่ง JSON ของฉันโดยตรงไปยังตัวแปร Javascript ทั่วโลก:
HTML:
<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
จากนั้นบันทึกข้อมูลในบริการจากนั้นบู๊ตแอป