Вот мой код, который, как я ожидаю, будет начинаться сверху, а выполнение будет продолжаться вниз. Первые два предложения получают запись из базы данных, а затем обновляют объект «я». Однако, когда выполнение достигает Q.all, метод возвращает промисы, а не фактически разрешает промисы и помещает значение в locs (и, в конечном итоге, «я»). В конце концов обещания будут разрешены, но после "return self" в последнем предложении then. Мне нужно, чтобы self.locations был установлен до запуска «return self».
return dao.getRecords(APP_COLLECTION, filters).then(function(data) {
return self.loadClientAppImpl(data);
}).then(function() {
locArray = self.app.field_194_raw;
return dao.getChildren("object_23", self.appId, "field_210", "field_164").then(function(knackRecord) {
self.priorCarriers = knackRecord.records;
});
}).then(function() {
var locPromiseArray = getPromisesArray(locArray);
return Q.all(locPromiseArray).then(function(locs){
self.locations = locs;
});
}).then(function() {
return self;
}).done();
Я думал, что множественные промисы должны действовать так же, как и промисы одиночного вызова?
т.е. dao.getRecords в порядке, но почему Q.all([dao.getRecords1, dao.getRecord2 и т. д.]) не работает, как я мог ожидать (т.е. не разрешается до «return self;»)?
Следующий код работает нормально, я заменил Q.all одним обещанием, и все работает, как и ожидалось (т.е. возвращает себя, вызываемого последним в цепочке). Остается вопрос: почему Q.all не работает так же? Я предполагаю, что это именно то, как это должно работать, и я ничего не понимаю в реализации.
return dao.getRecords(APP_COLLECTION, filters).then(function(data) {
self.loadClientAppImpl(data);
}).then(function() {
locArray = self.app.field_194_raw;
return dao.getChildren("object_23", self.appId, "field_210", "field_164").then(function(knackRecord) {
self.priorCarriers = knackRecord.records;
});
}).then(function() {
var locPromiseArray = getPromiseArray(locArray);
return locPromiseArray[0].then(function(locs){
self.locations = locs;
});
}).then(function() {
return self;
}).done();
Вот метод getPromisesArray
function getPromiseArray (locArray) {
var locationCollection = "object_22";
//create a promise for all of the records
var locationPromiseArray = [];
if(locArray[0]){
var locId0 = locArray[0].id;
//dao.getRecord returns a promise
locationPromiseArray.push(dao.getRecord(locationCollection, locId0));
}
if(locArray[1]){
var locId1 = locArray[1].id;
locationPromiseArray.push(dao.getRecord(locationCollection, locId1));
}
if(locArray[2]){
var locId2 = locArray[2].id;
locationPromiseArray.push(dao.getRecord(locationCollection, locId2));
}
if(locArray[3]){
var locId3 = locArray[3].id;
locationPromiseArray.push(dao.getRecord(locationCollection, locId3));
}
return locationPromiseArray;
};
Спасибо за любую помощь!
Отметка
PS. Я заметил, что приведенный ниже код ведет себя по-другому, и я ожидал, что он будет работать так же. Начал задаваться вопросом, нашел ли я ошибку. В первом случае «результаты» заполняются значениями (как и должно быть). Во втором случае «результаты» — это обещание. Разве они не должны быть одинаковыми так или иначе?
return dao.getRecords(APP_COLLECTION, filters).then(function(data) {
self.loadClientAppImpl(data);
}).then(function() {
return dao.getChildren("object_23", self.appId, "field_210", "field_164");
}).then(function(knackRecord) {
self.priorCarriers = knackRecord.records;
locPromiseArray = getPromiseArray(self.app.field_194_raw);
return Q.all(locPromiseArray).then(function(results){
self.locations = results;
return self;
});
});
return dao.getRecords(APP_COLLECTION, filters).then(function(data) {
self.loadClientAppImpl(data);
}).then(function() {
return dao.getChildren("object_23", self.appId, "field_210", "field_164");
}).then(function(knackRecord) {
self.priorCarriers = knackRecord.records;
locPromiseArray = getPromiseArray(self.app.field_194_raw);
return Q.all(locPromiseArray);
}).then(function(results){
self.locations = results;
return self;
});
then
вы создаете обещание, используяQ.all
, а затем — во внутреннем вызовеthen
— разрешаете это обещание со значениемself
. Затем первыйreturn
содержит обещание, которое в конечном итоге будет разрешено со значениемself
. - person Razem   schedule 23.07.2014getPromiseArray
метод. Разве он не возвращает массив обещаний? - person Bergi   schedule 23.07.2014return self;
должна произойти после того, как все обещания, перечисленные вQ.all
, будут выполнены. Вызывающий должен получить обещание, созданное вызовомdone
, которое в конечном итоге должно быть выполнено вызовомself
. Этот код должен работать именно так. Если он возвращает что-то еще, возможно, у вас другой код. - person Razem   schedule 23.07.2014Q.all
, а вызовthen
переместится в цепочку доreturn self;
. Если это не сработает, у меня закончились идеи. :D - person Razem   schedule 23.07.2014.bind
. - person Benjamin Gruenbaum   schedule 23.07.2014then
в основную цепочку. - person Razem   schedule 23.07.2014