2015-10-06 3 views
0

hmmm, я застрял на этом какое-то время, надеюсь, я смогу получить некоторые подсказки от вас, ребята.угловой код js в. Then функция выполнена до обещания заканчивается

я положил некоторые примеры кода здесь, чтобы проиллюстрировать этот вопрос: http://jsfiddle.net/HB7LU/18216/

так в основном, я ожидал console.log («из положить данные для элемента» + номер); выполняться сразу после завершения вызова mySvc.get(), когда я нажимаю элемент участника.

$q.all([ 
    mySvc.get({id: number}) 
]).then(function() { 
    console.log('out put data for member ' + number); 
}); 

но это не тот случай, когда он работает только в первый раз, когда вы нажимаете на него. второй раз, когда вы нажимаете на него, происходит обратное.

XHR finished loading: GET "http://fiddle.jshell.net/HB7LU/18216/show/test?id=1" 
(index):53 loading data - rest call finished 
(index):68 out put data for member 1 <- this is correct 
(index):68 out put data for member 2 <- this is wrong, should wait till rest call finishes 
XHR finished loading: GET "http://fiddle.jshell.net/HB7LU/18216/show/test?id=2 
(index):53 loading data - rest call finished 

ps: Я проверил его в хромированном состоянии. havent проверил его в других браузерах

, пожалуйста, дайте мне знать, как я могу это исправить. благодаря!

+0

Можете вы добавить код для mySvc.get? Возвращает ли mySvc.get() обещание? $ q.all() передается массив $ q.promises. Итак, если вы не возвращаете обещание от .get(), тогда это не сработает. Покажите, пожалуйста. – frosty

ответ

0

Вы возвращаетесь то же отложил каждый раз, вместо того, чтобы создавать новую, если вы переместили создание отсроченного внутри вызова GET или просто вернули обещание от $ HTTP называете это работает отлично

myService.get = function(requestParams) { 
    var deffered = $q.defer(); 

http://jsfiddle.net/jc04arnn/

+0

aw ... пропустил это ... спасибо! он отлично работает! – innek

0

Вам нужно создать новый отложенный каждый раз, когда он вызывает .get(). См. Исправленный код. Поскольку вы можете разрешить только один раз, вы можете разрешить его несколько раз без события. Он разрешает это только в первый раз. После этого, в любое время, когда он вернет это обещание, он сразу же запустит. Then, потому что отложенное уже разрешено.

myService.get = function(){ 
    var deffered = $q.defer(); 

http://jsfiddle.net/8qLrnz5o/

+0

Благодарим вас за ответ! так как shaunhusain ответил на него первым, поэтому я выбрал его ответ как лучший ответ. спасибо тебе! – innek

0

Другое решение вернуть обещание, которое создает $ HTTP (первый положить обратный вызов, а затем вернуть обещание):

myService.get = function(requestParams) { 
    var call = $http({ 
     method: 'GET', 
     url: TEST_DATA_URLS, 
     params: requestParams 
    }); 

    call.success(function (msg) { 
     console.log('loading data - rest call finished'); 
    }); 

    return call; 
}; 

при вызове mySvs.get у вас есть то же самое обещание:

mySvc 
    .get({id: number}) 
    .then(function() { 
      console.log('out put data for member ' + number); 
     }); 

Вот сценарий: http://jsfiddle.net/tmbs0b1L/

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