Дождитесь окончания методов обработки сигналов
У меня есть три метода:
myHub.server.getColumnSettings().done(function (result) {
if (result) {
//Do stuff with result
}
});
myHub.server.getDefaultGroupedBy().done(function(result) {
if (result) {
//Do stuff with result
}
});
function init() {
//Do more stuff
}
Я хотел бы, чтобы getColumnsSettings закончил, и после этого я хочу, чтобы getDefaultGroupedBy закончил, и после этого init().
Я попытался следовать, но это не сработало..
var defer = $q.defer();
defer.promise
.then(function() {
myHub.server.getColumnSettings().done(function (result) {
if (result) {
//Do stuff with result
}
});
})
.then(function() {
myHub.server.getDefaultGroupedBy().done(function(result) {
if (result) {
//Do stuff with result
}
});
})
.then(function() {
init();
});
defer.resolve();
1 ответ
Цепочка обещаний, которую вы ищете, работает только в том случае, если вы возвращаете обещание снова в любом блоке then. Если вы не вернете обещание, дескриптор then немедленно вернет неопределенное значение, и последующие обработчики будут немедленно вызваны. Однако если вы вернете обещание, следующее then
обработчик будет ждать выполнения этого обещания и так далее.
Кроме того, похоже, ваши методы getColumnSettings
а также getDefaultGroupedBy
уже возвращают обещания, поэтому вместо того, чтобы оборачивать их в отложенный объект, вы можете использовать их сразу же. Однако, если вы точно не знаете, как ведут себя обещания, возвращаемые SignalR, вы все равно можете обернуть их, используя $q api Angular.
Вы должны быть в состоянии написать что-то вроде:
var columnSettingsPromise = $q(function(resolve, reject) {
myHub.server.getColumnSettings().done(function (result) {
if (result) {
// Do stuff with result
// resolve the promise with the obtained result (will be passed to the then handler)
resolve(result);
// we are returning a promise in this function which will be resolved at some point
} else {
reject(new Error('no column settings loaded'));
}
});
});
// wait until the column settings have been retrieved
columnSettingsPromise.
then(function(columnSettings) {
// return a new promise, the next then handler will wait for this promise
return $q(function(resolve, reject) {
myHub.server.getDefaultGroupedBy().done(function(result) {
if (result) {
// do stuff with the result
resolve(result);
} else {
reject(new Error('no default grouped by data loaded'));
}
});
});
})
// the next handler will only be called after the promise for getDefaultGroupedBy data has been resolved
// as soon as that's the case, just call init
.then(init);