2016-10-22 6 views
0

そして、私は約束を抱くように頭を抱えていると思うとき、私は何かを実装しようとすると、私は角度を完全に理解していないことがわかるようにつまずく。コードラインの権限をpromise chainにラップするAngularJS?

Arrgh!

私は自分のアプリケーションを初期化しており、Init ControllerとServiceファクトリを作成して、アプリケーションに必要な権限をユーザに設定するように要求しています。しかし、.factoryでは、私は約束のシーケンスを正しく作成する方法を理解することができません。私は逐次的にユーザーに尋ねたいと思うので、約束のチェーンをつくっています。

Promise 1 = ask for sms access 
    process 1 results 
    Promise 2 = ask for GET_ACCOUNTS 
     process 2 results 
     Promise 3 = ask for GPS 
     process 3 results 
     return to controller with all results 

最初の約束は、プラグインので、私は戻って要求しているユーザの権限で非同期使用しています、私を投げている:

function requestReadPermission() { // from cordova-plugin-sim 
// no callbacks required as this opens a popup which returns async 
    window.plugins.sim.requestReadPermission(); 
} 

return $q(requestReadPermission) 
.then(function(status) { 
    console.log(status) ; // just see what comes back 
    // do something with status 
    function getAccounts() { 
     cordova.plugins.diagnostic.requestContactsAuthorization() ; 
    } 
    return $q(getAccounts) 
}).then(function(status) { 
    console.log(status) ; // just see what comes back 
    // do something with status 
    function getGPS() { 
     cordova.plugins.diagnostic.requestLocationAuthorization() ; 
    } 
    return $q(getGPS) 
}).then(function(status) { 
    console.log(status) ; // just see what comes back 
    // do something with status 
    return allResults ; 
}) 

また、第二の二約束はすでに、コールバック関数であることを見て..私が望むようにそれらを実装できるかどうかわかりません。彼らはcordova-plugin-diagnosticsから来て、ドキュメントに次のように呼ばれています。

cordova.plugins.diagnostic.requestContactsAuthorization(function(status){ 
    if(status === cordova.plugins.diagnostic.permissionStatus.GRANTED){ 
     console.log("Contacts use is authorized"); 
    } 
}, function(error){ 
    console.error(error); 
}); 

cordova.plugins.diagnostic.requestLocationAuthorization(function(status){ 
    switch(status){ 
     case cordova.plugins.diagnostic.permissionStatus.NOT_REQUESTED: 
      console.log("Permission not requested"); 
      break; 
     case cordova.plugins.diagnostic.permissionStatus.GRANTED: 
      console.log("Permission granted"); 
      break; 
     case cordova.plugins.diagnostic.permissionStatus.DENIED: 
      console.log("Permission denied"); 
      break; 
     case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS: 
      console.log("Permission permanently denied"); 
      break; 
    } 
}, function(error){ 
    console.error(error); 
}); 

答えて

1

診断プラグインの機能は、プラグインのネイティブ部分から非同期結果を受信するコールバック関数を渡す必要があります。 しかし、2つの非同期コールバックの結果によって解決される約束を返すことによって、角度に適した方法でこれをラップすることができます。たとえば :

function myFunction(){ 
    var q = $q.defer(); 
    var statuses = {}; 
    cordova.plugins.diagnostic.requestContactsAuthorization(function(status){ 
     console.log('contacts: '+status); 
     statuses['contacts'] = status; 
     cordova.plugins.diagnostic.requestLocationAuthorization(function(status){ 
      console.log('location: '+status); 
      statuses['location'] = status; 
      q.resolve(statuses); 
     }); 
    }); 
    return q.promise; 
} 

その後、角度スタイルの約束を使用して、ラッパー関数を呼び出すことができます。

myFunction().then(function(statuses){ 
    for(var permission in statuses){ 
     console.log(permission+' is '+statuses[permission]); 
    } 
}); 
+0

[OK]を、私は、コールバックが私を投げた知っていました。どのようにあなたは 'シム'のアクセス許可を組み込むのだろうか?私はsimカードにアクセスすることを可能にするcordova-plugins診断を探していましたが、見つからなかったので、simova情報を得るためにcordova-plugin-simを使用していましたが、simの要求許可の実装は非同期ポップアップでコールバックはありません。 btw - 助けてくれてありがとう。私は正しい方向に行っていたが、オフトラックだった。 – rolinger

関連する問題