我在 NodeJS 中使用 Q Promise,但我的代码没有按预期工作。
我有一个 ObjA 类型的数组。每个 ObjA 都有一个 ObjB 类型的属性 objB。ObjB 有一个名为 extract 的异步方法,它执行异步任务并设置/更新 objB 属性。我Q.defer
在 async 函数中使用并返回延迟的承诺。
我将延迟承诺添加到数组并调用Q.all
. 这部分按预期工作并被objB.exract
调用(我已通过 验证console.log
)。
但是当我随后输出结果时,objB 属性并没有改变(即使我在提取中设置了它们)。
这是代码:
//file ObjA.js
exports.ObjA = function(data)
{
this._id = data.id;
this._created_at = data.created_at;
this._objB = new ObjB.ObjB(data.somefield);
};
//file ObjB.js
exports.ObjB = function(data)
{
this._afield = data;
this._bfield = '';
this._cfield = '';
};
exports.ObjB.prototype.extract = function()
{
var deferred = Q.defer();
async_call(this._afield, function(e, resp)
{
if (e)
{
console.log(e);
return deferred.reject(e);
}
else
{
this._bfield = resp.val1;
this._cfield = resp.val2;
console.log(this._bfield + ", " + this._cfield);
return deferred.resolve(resp);
}
};
return deferred.promise;
};
//main file,
var alist = [];
// code to populate alist with objects of type ObjA
var queue = [];
for (var i=0; i<alist.length; i++)
{
queue.push(alist[i]._objB.extract());
}
Q.all(queue).then(function(succ)
{
console.log('final values');
console.log(alist);
},
function(err)
{
console.log(err)
}
);
当我运行它时,extract 被正确调用,this._bfield
并且this._cfield
正确地从console.log
. 但接下来是成功函数 for Q.all()
,它打印“最终值”,然后是“” for objB._bfield
and objB._cfield
。
为什么提取中设置的值没有被打印?我猜这与对象引用有关,但无法确定这里有什么问题。
任何帮助将不胜感激。
谢谢