gpt4 book ai didi

javascript - 制作具有异步构造函数的对象数组

转载 作者:搜寻专家 更新时间:2023-11-01 00:43:15 26 4
gpt4 key购买 nike

我想用 NodeJS 做以下事情。制作以下内容的对象数组,其中每个对象都有不同的局部变量,它们在初始化时希望在其中获取。

obj.js

var Obj = function (_id) {
this.id = _id;
var that=this;
db.getData(_id,function(collection){ //this method is asynchronous

collection.toArray(function(err, items) {
that.data=items;
});
});
}

Obj.prototype.data = [];

module.exports = Obj;

app.js

var arr=[];
arr.push(new obj(24));
arr.push(new obj(41));
arr.push(new obj(24));
arr.push(new obj(42));
//then do tasks with the arr

但由于 arr 构造函数是同步的,所以当我使用 arr 进行计算时,它们可能无法获取所有数据。那么如何处理这种情况呢?在对它们进行任何操作之前,我想确保所有对象都已成功创建。

提前致谢。

最佳答案

伙计,@mscdex 说的是正确的。首先,在您的代码中,data 将在内存中共享,您应该在构造函数中使用 this.data=[]。其次,正如@mscdex 所说,将您的方法移动到原型(prototype)中,比如说

Obj.prototype.load=function(){
//code here...
}

然后你的代码如下:

var Obj = function(_id){
this.id=_id;
this.data = [];
}
Obj.prototype.load = function(){
var that = this;
db.getData(this.id,function(collection){ //this method is asynchronous
collection.toArray(function(err, items) {
that.data=items;
});
});
return that;
}

最后,你的问题,你怎么知道他们都准备好了。

Obj.prototype.ready = [];
Obj.prototype.loaded=function(){
this.ready.push(1);
if(this.ready.length == Obj.target)
Obj.onComplete();
}
Obj.notifyme = function(callback,len){
Obj.target = len;
Obj.onComplete = callback;
}

上面的代码设置了一个数组来计算加载完成的实例(使用数组是因为无法从实例的 __proto__ 引用中读取基本值)。所以你应该做的是将这个事件(函数)添加到load,所以最后的代码可能如下:

Obj.prototype.load = function(){
var that = this;
db.getData(this.id,function(collection){ //this method is asynchronous
collection.toArray(function(err, items) {
that.data=items;
that.loaded();
});
});
return that;
}
var args = [24,41,42];
Obj.notifyme(function(){/*then do tasks with the arr*/},args.length);
var arr = args.map(function(arg){
return new Obj(arg).load();
});

告诉函数notifyme 回调工作和实例数。最后一个问题是,如果您多次执行此例程,您应该重置 targetcallback,因为它们是 Obj 全局对象。

关于javascript - 制作具有异步构造函数的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27505878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com