Дождитесь окончания методов обработки сигналов

У меня есть три метода:

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);
Другие вопросы по тегам