检查对象是否准备好使用javascript
我有一个javascript对象:检查对象是否准备好使用javascript,javascript,jquery,Javascript,Jquery,我有一个javascript对象: var Car = { data: { "wheels": 4, "colour": "red", }, changeColour: function(colour){ Car.coulour = colour; }, } 我需要实现以下功能: var car_obj = Car || {} car_obj.isReady = function(){ car_obj.ch
var Car = {
data: {
"wheels": 4,
"colour": "red",
},
changeColour: function(colour){
Car.coulour = colour;
},
}
我需要实现以下功能:
var car_obj = Car || {}
car_obj.isReady = function(){
car_obj.changeColour("blue");
};
isReady
应该等到对象准备好使用,然后对对象进行一些操作。如何实现此功能?您可以做两件事:
var Car = {
data: {
"wheels": 4,
"colour": "red"
},
changeColour: function(colour){
Car.data.colour = colour; // <----should be changed to Car.data.colour
} // <---- , not required.
}
使用
Object.observe()
可以执行以下操作:
Object.observe(Car, function(changes){
// This asynchronous callback runs
changes.forEach(function(change) {
console.log(change); // log the changes.
});
});
给
CAR
一个构造函数包装:
function Car(data) {
//Build base
var Car = {
data : {
"wheels" : 4,
"colour" : "red",
},
changeColour : function (colour) {
Car.data.colour = colour;
}
}
//Parse inputs
if (typeof data === 'object') {
if (typeof data['colour'] !== 'undefined') {
Car.changeColour(data['colour']);
}
}
//Return object
return Car;
};
var car = new Car({
colour : 'blue'
});
console.log(car);
这样,在您尝试分配任何内容之前,您可以确定对象已完成“构建”。这种异步代码是通过两种不同的方式在JavaScript中完成的:
var Car = function(ready) {
var self = this;
self.data = { /* ... */ };
self.changeColour = { /* ... */ };
// invoke ready, when the object is read:
ready();
return self;
}
var runWhenCarReady = function() { /* */ }
var car = new Car(runWhenReady);
承诺
您的构造函数应该返回一个承诺,该承诺将在构造函数完成其工作后得到解决
var Car = function() {
var deferred = $.Deferred(); // jQuery promises implementation
// ...
// when ready run this code to return the value wrapped in the promise:
deferred.resolve(self.this);
// ...
return deferred.promise;
};
使用构造函数的代码应执行以下操作:
var promise = Car().then(function(car) {
// car is available here
}
涉及对象轮询的解决方案不是一个好主意,因为它们会阻塞网页
您可以在jQuery.Deferred
或中阅读有关承诺的内容,或者在web上搜索“JavaScript承诺”
最后说明
这仅在涉及异步代码时才有必要。否则,JavaScript“按顺序运行”,因此您可以保证在一行代码中创建的内容在下一行代码中可用。我想你过分简化了你的样品
JavaScript异步性最常见的情况是AJAX调用。对于jQuery,他们使用promise模式。这类似于“可观察”的设计模式。你应该看看KnockoutJS=>@ADreNaLiNe DJ我只需要使用jQuery或纯javascript。是什么让这个对象可以使用?没有足够的信息提供它应该这样工作:当创建
Car
对象的实例并准备好使用时,应该调用isReady
函数中的所有内容,以防止类型错误:调用未定义。Car
是一个对象,不能创建对象的实例。您可以使用Object.create
从对象派生新对象。也就是说,“功能描述”创建了一个对汽车的引用副本,或者如果它不存在,则创建一个新的空对象。在后一种情况下,car\u obj.isReady()
将始终失败。它可以工作,但有没有办法在没有car\u obj.isReady()的情况下自动调用此函数?如果不创建我的
Car`对象实例,会发生错误吗?函数应该等到对象被创建。将不会创建汽车对象。是否会发生错误?当然,但是如果你想访问它的属性,你必须创建一个对象,这就是为什么你有这个var car_obj=car |{}
,现在你可以自动使用观察者了。我可以看到,所以没有办法像我想的那样使用它:car_obj.isReady=…
没有observe
等等?我认为你对此无能为力,但是observators
产生了巨大的影响,大多数前端mv*框架使用它进行双向数据绑定,以查找更改和更新。但是,我会说更多的,也许这会帮助你理解我想要实现的目标。因此,我在这个Car
对象中有一些方法,这些方法从localStorage
加载数据,例如,它加载颜色、车轮等
,我想对这个对象数据进行一些操作,即获取汽车模型。当我使用nanobay.getModel()时代码>它返回null,因为它的对象尚未加载数据,但当我在$(document.ready(function(){})中使用它时代码>它将显示数据。这就是我想要等待的,直到对象加载所有数据,然后对其进行一些操作。我能做到吗?
var promise = Car().then(function(car) {
// car is available here
}