Parse Promise 'when' 返回 undefined(Javascript)



我正试图遵循Parse JavaScript SDK上的"when"示例: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, ...]
        })
    }); 
};

数组参数的长度正确,但不确定其值未定义的原因。

写入时,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()的调用程序也会被告知最终的异步结果

最新更新