将列表传递给 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. 何时(承诺 1,承诺 2)
  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]));
    }

});