2016-03-14 3 views
0

У меня есть три метода:ждать методы signalr закончить

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(); 
+0

ли 'getColumnSettings()'/'getDefaultGroupedBy()'/'сделано()' вернуть обещания? – Bergi

+0

'then' не волшебным образом обнаруживает асинхронные вещи в своих обратных вызовах. Вам нужно бросить ему кость: 'return' обещание, иначе оно не может дождаться этого. – Bergi

ответ

1

Обещание сцепления вы ищете только работает, если вы возвращаете обещание снова в любом затем блоке. Если вы не вернете обещание, тогда дескриптор немедленно вернет неопределенные и последующие обработчики будут вызваны мгновенно. Если, однако, вы вернете обещание, следующий обработчик then будет ждать разрешения этого обещания и так далее.

Кроме того, похоже, что ваши методы getColumnSettings и getDefaultGroupedBy уже возвращают обещания, поэтому вместо их переноса в отложенном объекте вы можете использовать их сразу же. Если, однако, вы точно не знаете, как ведут себя обещания, возвращаемые SignalR, вы можете их обернуть, используя $ q api.

Вы должны быть в состоянии написать что-то вроде:

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); 
+0

Спасибо! Я попробую это. Но как это будет выглядеть, если я оберну его в отложенный объект? – MrProgram

+0

Пробовал это, в '.then()' параметр defaultGroupedBy не был результатом 'getDefaultGroupedBy()', вместо этого он был результатом 'getColumnSettings()' – MrProgram

+0

hmm .. тогда это может быть проблема с типом обещание, которое возвращается из 'myHub.server.getColumnSettings()'. Я обновлю ответ, чтобы использовать отложенную api, которая должна сделать трюк. – burnedikt