Nếu tôi hiểu nó một cách chính xác, bạn sẽ muốn làm điều gì đó như sau:
var positions = this.getPositions(function(positions) {
console.log(positions[0]);
});
Đó là, bạn sẽ muốn viết "getPositions" theo cách mà nó chấp nhận một tham số gọi lại duy nhất được gọi sau khi các vị trí đã tải thành công và được chuyển vào mảng vị trí. Trong getPositions
bạn có thể kiểm tra xem các vị trí đã được tải chưa và nếu có, hãy trực tiếp gọi lại. Nếu không, bạn sẽ thêm chúng vào hàng đợi gọi lại (ví dụ:this.positionsLoadedCallbacks
), qua đó bạn lặp lại sau khi tất cả các vị trí đã được tải (tôi nghĩ rằng đó sẽ nằm ở đâu đó trong load
của bạn hàm gần me.orderPositions()
).
Ví dụ:getPositions
của bạn hàm có thể trông như thế này:
getPositions : function(callback) {
if(this.positions !== null) {
callback(this.positions);
return;
}
this.positionsLoadedCallbacks.push(callback);
},
Ở một nơi nào đó sau khi bạn chắc chắn rằng các vị trí đã được tải (tức là trong lệnh gọi lại thành công loadJSON), bạn sẽ cần đặt một cái gì đó như sau:
for(var i=0; i < this.positionsLoadedCallbacks.length; i++) {
this.positionsLoadedCallbacks[i](this.positions);
}
Và đừng quên khởi tạo this.positionsLoadedCallbacks
:)
câu đố trên console.log
Lý do mà console.log(positions)
hoạt động và console.log(positions[0])
không dễ dàng:nếu bạn chuyển một tham chiếu đối tượng tới console.log
, đối tượng sẽ được kiểm tra khi bạn nhấp vào mũi tên "mở rộng" nhỏ và cố gắng xem xét bên trong đối tượng / mảng. Tất nhiên, vào thời điểm bạn nhấp vào mũi tên đó, các vị trí đã được tải. Tuy nhiên, nếu bạn chuyển một phần tử mảng cụ thể (ví dụ:positions[0]
) nó sẽ trực tiếp cố gắng tra cứu giá trị đó, thấy rằng nó vẫn là undefined
và ghi lại kết quả đó trong bảng điều khiển.
Hãy tự mình thử:
var i = [];
console.log([i]);
i.push(123);
Đoạn mã trước đó, trong chrome 24, hiển thị [Array[0]]
trong bảng điều khiển, nhưng khi tôi mở rộng nó, nó cho tôi biết rằng mảng là length: 1
và phần tử đầu tiên của nó là 123