将列表传递给 Parse.Promise.when 但仅获取承诺链中的第一个元素
Pass a list to Parse.Promise.when but only get first element in promises chain
大家好,我在 Parse Cloud Code 中使用 Parse.Promise.when 时遇到问题。
在我的 Parse Cloud Code 中,我想更新已存在于我的数据库中的航班记录列表的到达时间。
我正在做的是传递一个 flight_list
这是最新的航班记录并迭代每条记录,使用 Parse.Query.first
找到响应记录并将承诺推送到列表和 return 列表到下一个承诺链 then
函数。
我希望我能得到一个结果列表,但我只得到第一个查询结果而且不知道为什么。以下是我的代码:
// Here we start a function
Parse.Cloud.httpRequest(
// Some HTTP request
).then(function(httpResponse) {
// Some pre-processing...
// flight_list is obtained here. It is a list of javascript object
// Here start the related code
var FlightInfo = Parse.Object.extend('FlightInfo'); // Flight object
var promises = []; // Promise list for next promise chain input
// Iterate each element in flight_list
_.each(flight_list, function(flight) {
var query = new Parse.Query(FlightInfo);
query.equalTo('flight_date' , flight_date);
query.equalTo('air_carrier' , flight.air_carrier);
query.equalTo('flight_no' , flight.flight_no);
query.equalTo('terminal' , flight.terminal);
query.equalTo('origin' , flight.origin);
// Push query.first promises to a list
promises.push(query.first());
});
// Return promise list and flight_list for next "then" function use
return Parse.Promise.when(promises, flight_list);
}).then(function(query_result) {
// 1. query_result should be the promises list in the previous then function
// 2. flight_list will be accessed using argument keyword
// !! Only got first element from promises list in previous function
console.log('query_result:');
console.log(query_result);
// No problem for flight_list.
for (var i = 0; i < arguments.length; i += 1) {
console.log(i + ':' + JSON.stringify(arguments[i]));
}
});
如上面的代码,我希望 query_result
是 javascript 对象(航班信息)的列表,例如:[{object1}, {object2}, {object3}, ...]
但是 query_result
是一个对象:{object1}
。它甚至不是像 [{object1}]
.
这样的列表中的一个对象
我的代码中是否遗漏了什么?我应该如何修改我的代码以获得正确的 return 值?
您对 API 参数感到困惑。 Parse.Promise.when 有 2 个签名 -
- 何时(承诺 1,承诺 2)
- when(promises) <- 不能将 flight_list 作为第二个参数发送,因为它不是一个 promise。
由于您发送的不是承诺的第二个参数,因此您在不知不觉中使用了第一个参数。因此响应只有一个元素对应于第一个承诺。
解决方案是
// Where mFlightList is a global variable
mFlightList = flight_list;
return Parse.Promise.when(promises);
}).then(function() {
// arguments contains the actual result of the promises passed in 'when'
for (var i = 0; i < arguments.length; i += 1) {
console.log(i + ':' + JSON.stringify(arguments[i]));
}
});
大家好,我在 Parse Cloud Code 中使用 Parse.Promise.when 时遇到问题。
在我的 Parse Cloud Code 中,我想更新已存在于我的数据库中的航班记录列表的到达时间。
我正在做的是传递一个 flight_list
这是最新的航班记录并迭代每条记录,使用 Parse.Query.first
找到响应记录并将承诺推送到列表和 return 列表到下一个承诺链 then
函数。
我希望我能得到一个结果列表,但我只得到第一个查询结果而且不知道为什么。以下是我的代码:
// Here we start a function
Parse.Cloud.httpRequest(
// Some HTTP request
).then(function(httpResponse) {
// Some pre-processing...
// flight_list is obtained here. It is a list of javascript object
// Here start the related code
var FlightInfo = Parse.Object.extend('FlightInfo'); // Flight object
var promises = []; // Promise list for next promise chain input
// Iterate each element in flight_list
_.each(flight_list, function(flight) {
var query = new Parse.Query(FlightInfo);
query.equalTo('flight_date' , flight_date);
query.equalTo('air_carrier' , flight.air_carrier);
query.equalTo('flight_no' , flight.flight_no);
query.equalTo('terminal' , flight.terminal);
query.equalTo('origin' , flight.origin);
// Push query.first promises to a list
promises.push(query.first());
});
// Return promise list and flight_list for next "then" function use
return Parse.Promise.when(promises, flight_list);
}).then(function(query_result) {
// 1. query_result should be the promises list in the previous then function
// 2. flight_list will be accessed using argument keyword
// !! Only got first element from promises list in previous function
console.log('query_result:');
console.log(query_result);
// No problem for flight_list.
for (var i = 0; i < arguments.length; i += 1) {
console.log(i + ':' + JSON.stringify(arguments[i]));
}
});
如上面的代码,我希望 query_result
是 javascript 对象(航班信息)的列表,例如:[{object1}, {object2}, {object3}, ...]
但是 query_result
是一个对象:{object1}
。它甚至不是像 [{object1}]
.
我的代码中是否遗漏了什么?我应该如何修改我的代码以获得正确的 return 值?
您对 API 参数感到困惑。 Parse.Promise.when 有 2 个签名 -
- 何时(承诺 1,承诺 2)
- when(promises) <- 不能将 flight_list 作为第二个参数发送,因为它不是一个 promise。
由于您发送的不是承诺的第二个参数,因此您在不知不觉中使用了第一个参数。因此响应只有一个元素对应于第一个承诺。
解决方案是
// Where mFlightList is a global variable
mFlightList = flight_list;
return Parse.Promise.when(promises);
}).then(function() {
// arguments contains the actual result of the promises passed in 'when'
for (var i = 0; i < arguments.length; i += 1) {
console.log(i + ':' + JSON.stringify(arguments[i]));
}
});