这是我的代码
db.query(str, arr, function selectCb(error, results, fields) {
if (error) {
return proceed(false, {errno:'010',message:error.message}, request);
}
var q = async.queue(function (results, callback) {
// add the gib infor
if (results.refertype=='G') {
var input={};
input.fields="*";
input.gibname=results.refername;
gib.getgibinternal(input, makeCallback(i));
function makeCallback(index) {
return function(gresult) {
results.gib=gresult.data[0];
callback(results);
}
}
// add the user info
} else if(results.refertype=='U') {
var input={};
input.username=results.refername;
input.fields="*";
user.getuserinternal(input, makeCallbackuser(i));
function makeCallbackuser(index) {
return function(gresult) {
results.user=gresult.data[0];
callback(results);
}
}
}
}, results.length);
// assign a callback
q.drain = function() {
return proceed(true, self.results, self.request);
}
self.results=results;
for (var i=0; i<results.length; i++) {
// the first console
console.log(results[i]);
// add some items to the queue
q.push(results[i], function (results) {
results[i]=results;
self.results[i]=results;
//the second console.
console.log(results);
});
}
if (results.length==0) {
return proceed(true, results, request);
}
});
上述代码的输出是:
// the first console
{ cardid: 30,
cardtype: 'I',
status: 'A',
refername: 'admin',
refertype: 'U' }
// the second console
{ '1': [Circular],
cardid: 30,
cardtype: 'I',
status: 'A',
refername: 'admin',
refertype: 'U',
user:
{ name: 'admin',
username: 'admin',
deleted: 'N' } }
如何添加'1': [Circular],
。
答案 0 :(得分:1)
这一位:
q.push(results[i], function (results) {
与此相同(进行一些重命名以便更容易跟踪范围):
q.push(self.results[i], function(r) {
r[i] = r; // <------------------- Look at me!
self.results[i] = r;
//the second console.
console.log(r);
});
self.results[i]
更改仅来自self.results=results;
循环正上方的for
。有趣的是这个:
r[i] = r;
如果i
为1,您将向1
添加名为r
的属性,其值为r
,因此[Circular]
。我会猜测results.length
是2并且你的函数作为i
的封闭,最后使用i
的最后一个值,这就是你得到{的原因{1}}而不是'1'
属性。
我看到可能导致你麻烦的三件主要事情:
'0'
的经典闭包问题。i
,所以很容易忘记你正在使用哪一个。results
。另一个可能的混淆源是r[i] = r;
和results
是同一个对象,但可能没问题。
答案 1 :(得分:0)
好像它是一个循环引用,console.log正在消除它。尝试执行console.log(Object.keys(results['1']));
以获取有关对象1