2017-08-01 22 views
-2

私は非同期的に私の機能を実行したいが、私は発見した問題のTypescriptで関数を非同期で実行するには?

checkLocation() { 
     return __awaiter(this, void 0, Promise, function*() { 
      while (true) { 
       setTimeout(function() { 
        this.diagnostic.isLocationEnabled().then(
         (isAvailable) => { 
          console.log('Is available? ' + isAvailable); 
          if (!isAvailable) { 
           alert('Please turn on the location service'); 
          } 
         }).catch((e) => { 
          console.log(e); 
         }); 
       }, 5000) 
      } 
     }); 
    } 
} 

ワン?:ということをどのように行うかは、TSは罰金名前__awaiterことができないということです。私は従うことを試みたthis

+2

質問の中のコードから '__awaiter'が利用できない理由を知る方法がありません。これは、同期/非同期とは何の関係もありません。 –

+0

私はちょうど私が投稿したリンクに従おうとしました。だから私はあなたに頼んでいるのです:) –

+1

'__awaiter'はあなたが書いたものではありません。 'async' /' await'関数があれば、TypeScriptコンパイラによって出力されます。あなたのリンクから:* "上のサンプルの場合、TypeScriptコンパイラは、以下のES6 JavaScriptを' ping'関数用に発行します。 "*これは明らかに、' __awaiter'を含むコードはTypeScriptコンパイラの**出力**です。 –

答えて

0

私がコメントで言ったように、__awaiterはないあなたは書く。 TypeScriptコンパイラによって出力されるのは、async/awaitの場合です。あなたがやりたい言っ再

[それ](電話で)ロケーションサービスは、チェックがあるため、関係なく、非同期になり、非同期

有効になっているかどうかを確認する必要がありthis.diagnostic.isLocationEnabledは非同期です。

async/awaitcheckLocationawait介しisLocationEnabledから約束を消費するasync方法、作ることであろう書き込む方法:

async checkLocation() { 
    const isAvailable = await this.diagnostic.isLocationEnabled(); 
    console.log('Is available? ' + isAvailable); 
    if (!isAvailable) { 
     alert('Please turn on the location service'); 
    } 
    return isAvailable; 
} 

その非async/awaitバージョンは、この使用されています明示的に約束します:

checkLocation() { 
    return this.diagnostic.isLocationEnabled().then(isAvailable => { 
     console.log('Is available? ' + isAvailable); 
     if (!isAvailable) { 
      alert('Please turn on the location service'); 
     } 
     return isAvailable; 
    }); 
} 

catch handlを削除しましたこれは、呼び出し元にエラー処理を延期しているからです。

checkLocationは、フラグの(約束)を返すのではなく、火災と忘れのためのものであれば、async関数を一切使用せず、約束を返さない(したがって、 catch):

checkLocation() { 
    this.diagnostic.isLocationEnabled().then(isAvailable => { 
     console.log('Is available? ' + isAvailable); 
     if (!isAvailable) { 
      alert('Please turn on the location service'); 
     } 
    }).catch((e) => { 
     console.log(e); 
    }); 
} 
+0

あなたの最後の提案です。しかし、私はそれを実行し続けるようにしたい場合は、 'this.diagnostic.isLocationEnabled()の前にwhileループを置くことはできません。それからisAvailable => {'? –

+0

@GeorgeW:「走らせ続ける」とはどういう意味ですか?うまくいけば –

+0

'isAvailable'がfalseである限り、アラートを表示し続ける必要があることを意味します。正しく動作させるためには、アプリケーションがユーザの場所を必要とするので必要です。 –

関連する問題