Parse Promise'when'返回undefined(Javascript)

时间:2016-04-21 03:56:22

标签: javascript parsing promise

我正试图关注Parse JavaScript SDK: Parse.Promise上的“何时”示例 使用以下代码:

GetFromDB2 = function(id) {
    var DB2 = Parse.Object.extend("DB2");
    var q = new Parse.Query(DB2);
    q.get(id, {
        success: function(res) {
            return Parse.Promise.as(10);
        },
        error: function(res, err) {
            console.log( err);
        }
    });
}

GetData = function() {
    var DB1 = Parse.Object.extend("DB1");
    var query = new Parse.Query(DB1);
    query.equalTo("param", "close");

    query.find().then(function(results) {
        var promises = [];
        _.each(results, function(res) {
            promises.push(GetFromDB2(res.get("user")));
        });

        Parse.Promise.when(promises).then(function() {
            console.log(arguments); // expect: [10, 10, ...]
        })
    }); 
};

数组参数的长度是正确的,但不确定为什么它的值未定义。

1 个答案:

答案 0 :(得分:0)

如上所述,GetFromDB2()会返回undefined。要传递价值,它必须返回价值或承诺。

最简单的是,提交10,你可以写:

function GetFromDB2(id) {
    return 10;
}

但是要异步,并且仍然提供10,您需要返回一个将解析为10的承诺:

function GetFromDB2(id) {
    return Parse.Promise.as(10);
}

或者您真正想要的.get(id)查询:

function GetFromDB2(id) {
    var DB2 = Parse.Object.extend('DB2');
    var q = new Parse.Query(DB2);
    return q.get(id).then(function(res) {
        return 10;
    });
    //omit `.then(...)` entirely to deliver `res`
}

现在GetData()可以写成如下:

function GetData() {
    var DB1 = Parse.Object.extend('DB1');
    var query = new Parse.Query(DB1);
    query.equalTo('param', 'close');
    return query.find().then(function(results) {
        var promises = _.map(results, function(res) {
            return GetFromDB2(res.get('user'));
        });
        Parse.Promise.when(promises).then(function() {
            console.log(arguments); // expect: [10, 10, ...]
        }, function(err) {
            console.log(err);
            return err;
        });
    }); 
};

注意:

  • promises = _.map(...)_.each(...)加上'promises.push(...)更优雅。
  • 将错误处理程序移动到GetData()允许处理更大范围的可能错误,例如query.find()引起的错误。
  • 通过返回一个promise,GetData()的调用者也会被告知最终的异步结果。