我在for循环中获取空数组,而我在循环中追加变量
let data_info1 = '';
for (let i = 0; i < data.length; i++) {
var query = { '_id': mongoose.Types.ObjectId(data[i].coin_id) };
var coin_data = coin_model.find(query, function (err, info) {
var a = {}
a['coin_name'] = info[0].coin_code;
a['data_info'] = data[i];
var myJsonString = JSON.stringify(a);
data_info1 += JSON.parse(myJsonString);
});
}
console.log(data_info1)
答案 0 :(得分:3)
您在JSON.parse / stringify中遇到问题,在循环期间没有必要= /
看起来会更好:
let data_info1 = [];
for (let i = 0; i < data.length; i++) {
var query = { '_id': mongoose.Types.ObjectId(data[i].coin_id) };
var coin_data = coin_model.find(query, function (err, info) {
var obj = {
coin_name: info[0].coin_code,
data_info: data[i]
};
data_info1.push(obj);
});
}
console.log(JSON.stringify(data_info1))
此外,问题是coin_model.find
是同步还是异步?如果它是异步的,那么在循环之后就不可能console.log
,它将显示空结果=(
如果它是异步的,你需要将你的代码结构略有不同,并理解JS中的异步编码原理(例如使用Promises)。
const promiseList = [];
for (let i = 0; i < data.length; i++) {
var query = { '_id': mongoose.Types.ObjectId(data[i].coin_id) };
promiseList.push(new Promise(function(resolve, reject) {
coin_model.find(query, function (err, info) {
if (err) reject(err);
var obj = {
coin_name: info[0].coin_code,
data_info: data[i]
};
resolve(obj);
});
}));
}
// wait till all coin requests will be finished
Promise.all(promiseList).then(function(results) {
console.log(results);
});
注意if (err) reject(err)
,resolve(obj)
和Promise.all
。这对你来说可能非常棘手= /另外,在data.length
非常庞大(> 100个元素)的情况下,你会立即向你的数据库发出100个请求,这不是很酷=(可能是你需要组织请求队列。
以下是Promise.all API https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
的文档答案 1 :(得分:2)
这是因为您的循环执行速度非常快而且coin_model.find(query, function (err, info) {
不会导致该时间
你可以这样做 这是doc的链接 async
// Import async module
async = require('async');
async.eachOfSeries(data,
// Each item in array you can get here
function (item, index, cb) {
var query = { '_id': mongoose.Types.ObjectId(item.coin_id) };
var coin_data = coin_model.find(query, function (err, info) {
if (err) {
return cb(err)
} else {
if(Array.isArray(info) && info.length > 0){
var a = {}
a['coin_name'] = info[index].coin_code;
a['data_info'] = data[index];
var myJsonString = JSON.stringify(a);
data_info1 += JSON.parse(myJsonString);
cb()
} else {
cb('No result found in database')
}
}
});
},
//this is the final callback
function (err, result) {
//ii final callback here
})