我正试图关注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, ...]
})
});
};
数组参数的长度是正确的,但不确定为什么它的值未定义。
答案 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()
引起的错误。