2016-03-09 4 views
9

У меня есть простой запрос следующим образом:Анализировать Облако кода «первый» массив запроса возвращает различные результаты

var getGreaterQuestion = function (gid) { 
    var query = new Parse.Query(Parse.Object.extend("Question")); 
    query.equalTo("groupId", gid); 
    return query.first(); 
} 

Я готовлю массив, состоящий из этой функции:

var groupIds = _.range(1, 17); 
var groupIdAndRandomNumberPack = _.map(groupIds, function (gid) { 
    return {groupId: gid, random: Math.random()}; 
}); 

var pack = _.map(groupIdAndRandomNumberPack, function (queryItem) { 
    return getGreaterQuestion(queryItem.groupId, queryItem.random); 
}); 

В pack массиве, существует 16 различных «первых» запросов для класса Question.

Я бег этого запроса, используя следующий фрагмент кода:

return Parse.Promise.when(pack).then(function() { 
     console.log("arguments : " + JSON.stringify(arguments)); 
... 
... 
); 

аргументы является результатом моего запроса извлечения данных из MongoDB.

Если я запускаю этот запрос на синтаксическом бэкэнде, аргументы в формате JSON формат, как показано ниже:

{ 
    "0":{QuestionObject}, 
    "1":{QuestionObject}, 
    ... 
    "16":{QuestionObject} 
} 

Если я запускаю этот запрос на моем локальном экземпляре синтаксического анализа с MongoDB, определенный на MongoLAB, это дает следующий результат:

{ 
    "0":[ 
     {QuestionObject}, 
     {QuestionObject}, 
     .... 
     {QuestionObject} 
    ] 
} 

В чем причина этой разницы? Есть ли какая-либо конфигурация, которую мне нужно применить в MongoDB или синтаксическом выражении для получения того же результата, что и синтаксический анализ.

ответ

2

Это проблема с функцией Parse.Promise.when. Его реализация кажется измененной с this фиксацией.

В то время функция when применяла все результаты к вашей функции обратного вызова независимо от того, как вы подаете входные данные на when. Эти вызовы приводят к одному и тому же выводу:

Parse.Promise.when([promise0, promise1, ...]).then(resultFunc) 
Parse.Promise.when(promise0, promise1, ...).then(resultFunc) 

var resultFunc = function() { 
    console.log("arguments : " + JSON.stringify(arguments)); 
    //prints out like {"0": promiseResult0, "1", promiseResult1, ...} 
} 

Теперь это изменение изменилось. Он будет возвращаться в виде одного массива, если вы подаете входные обещания в виде массива, он будет применяться в качестве аргументов, если вы это сделаете. См. this line in commit.

+1

Ouch, «адаптивный когда()» падает где-то между великолепным и запутанным. Придется немного привыкнуть. –

Смежные вопросы