2016-04-11 14 views
0

$ httpリクエストを呼び出してJSONPを返すサービスがあります。 APIから返されるJSONPは{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!'); 

出力する(APIが有効戻った後はtrue):

'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()が完了するのを待つ方法を知りたい場合は、valuetrueまたはfalseに設定してから0に進んでください声明。

+0

promise($ 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 = responsethenがトリガされたときに、それが実行される)は、非同期です。この値は、そのコンテキスト外では使用できません(if)。応答を使用する必要がある場合は、then関数のすぐそこで使用するか、または約束を返して、別のthenで処理を続行します。

+0

async/awaitは解決策です。 async_/ES5への呼び出しを変換する複数のトランスフォームがバベルにあります - それは明らかに可能です。 –

+0

@robertotomás: 'async/await'は、約束のための構文的な砂糖です(バベルがそれらをES5に変換する方法です)ので、私は間違ったことは何も言わなかったと思います。さらに、答えが書かれた時を考えてみましょう - 'async/await'はまだ何の仕様にもありませんでした。彼らはまだありません。 ES2018用に計画されています。 – Amadan

+0

あなたは「あなたは**決して**非同期関数から値を返すことはできない」と言っています。 (強調する私)、あなたは間違っていた。 async/aswait _is_ syntactic sugar - あるいはむしろ、実際には標準のES6です - しかし、polybillとplugin-async-to-promisesのバベルはその構文を標準のCJSに変換します。だからそれは可能であるようです。私はあなたを投票しなかった、何か、btw。私は基本的にあなたに同意します。変換の何らかの形が一般化可能であることに留意してください。 –

関連する問題