我正试图遵循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()的调用程序也会被告知最终的异步结果