Я хочу сделать следующее с помощью 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
Но так как конструктор обр синхронное они не могут быть получить все данные, когда я делаю расчеты с обр , Итак, как справиться с этим сценарием? Я хочу, чтобы все объекты были успешно созданы, прежде чем выполнять какую-либо работу с ними.
Заранее спасибо.
Выполнение работы async в конструкторе действительно неудобно, почему бы не перенести эту работу на функцию прототипа? Также на несвязанной ноте, почему вы делаете «данные» с общим массивом? Похоже, что вы используете 'data' как переменную для каждого экземпляра вместо того, который используется для всех экземпляров' Obj'. – mscdex
Данные @mscdex отличаются от каждого объекта :) Я могу переместить асинхронную работу на другой метод прототипа. Итак, как я могу быть уверен, что работа async завершена? :) –
Установите флажок в экземпляре, после чего вы проверите свои другие функции прототипа, которые полагаются на 'data'. Кроме того, чтобы сделать 'data' переменной per-instance, вы можете удалить' Obj.prototype.data = []; 'и просто добавить' this.data = []; 'прямо внутри вашего конструктора. Или, может быть, вы можете использовать это как свой флаг - изначально установить 'this.data = undefined; ', тогда в ваших прототипных функциях сделайте что-то вроде:' if (! This.data) throw new Error (' No data '); ' – mscdex