0

我在 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._bfieldand objB._cfield

为什么提取中设置的值没有被打印?我猜这与对象引用有关,但无法确定这里有什么问题。

任何帮助将不胜感激。

谢谢

4

1 回答 1

0

注意'this'关键字,替换这段代码:

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);
    }
 };

至:

var that = this;
async_call(this._afield, function(e, resp){
    if (e)
    {
        console.log(e);
        deferred.reject(e);
    }
    else
    {
        that._bfield = resp.val1;
        that._cfield = resp.val2;
        console.log(that._bfield + ", " + that._cfield);
        deferred.resolve(resp);
    }
 });
于 2013-10-29T19:28:13.270 回答