2016-04-11 6 views
0

У меня есть служба, которая вызывает запрос $ http и возвращает JSONP. Возвращенный JSONP из API имеет значение {valid: true} или {valid: false}. Мой код:Ждите обещания решить перед выполнением кода

this.checkValid = function() { 
    return $http({ 
     method: 'JSONP', 
     url: 'API' + '?callback=JSON_CALLBACK', 
    }).then(function (response) { 
     var temp = response.data.valid; 
     return temp; //returns true or false 


    }, function (response) { 
     console.log('something went wrong'); 
    }) 
} 

Я еще одна услуга, которая зависит от реакции вернулся из checkValid():

   var data = requestService.checkValid(); 
       var valid; 
       //handling the promise 
       data.then(function (response) { 
        valid = response; 
        console.log('Inside the then block : ' + valid); 
       }); 

       if (valid) 
        console.log('Valid!'); 
       else 
        console.log('Not Valid!'); 

Выход (после того, как апи возвращает действительный: истина):

'Not valid' 
'Not valid' 
'Not valid' 
'Not valid' 
'Inside the then block : true' 
'Inside the then block : true' 
'Inside the then block : true' 
'Inside the then block : true' 

Хотелось бы знать, как подождать then(), чтобы установить, установив value в true или false, а затем перейти к if заявление.

+0

вы можете использовать обещание ($ q), чтобы обеспечить возврат результата, а затем выполнить следующий. ты пробовал ? –

ответ

1

You can never return a value from asynchronous function.

  data.then(function (response) { 
       valid = response; 
       console.log('Inside the then block : ' + valid); 
      }); 

valid = response является асинхронным (он будет выполнен, когда then срабатывает). Вы не можете использовать это значение вне этого контекста (т. Е. В вашем if). Если вам нужно использовать ответ, используйте его прямо там в функции then или верните обещание и продолжите обработку другим then.

+0

async/await - это решение. в Babel есть несколько преобразований, которые конвертируют async_/await вызовы на ES5 - так что это возможно. –

+0

@ robertotomás: 'async/await' является синтаксическим сахаром для обещаний (именно так Babel преобразует их в ES5), поэтому я не думаю, что я сказал что-то неправильное. Кроме того, подумайте, когда был написан ответ - 'async/await' еще не были в спецификации. Они все еще не являются; они запланированы для ES2018. – Amadan

+0

, где вы сказали: «Вы можете ** никогда ** возвращать значение из асинхронной функции». (внимание мое), вы были неверны. async/await _is_ синтаксический сахар - вернее, на самом деле это стандартная ES6, но, например, псевдонимы babel и plugin-async-to-promises преобразуют этот синтаксис в стандартный CJS. Так что это кажется возможным. Я никого не голосовал, кстати. Я в принципе согласен с тобой. Просто отметив, что какая-то форма преобразования является обобщаемой. –

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