2017-01-04 9 views
0

イオンフレームワークを使用してアンドロイドモバイルにネストされたフォルダを作成する必要があります。 問題は非同期であるため、最初のフォルダーを終了する前に、フォルダーがまだ作成されていないため、最初のフォルダー内に2番目のフォルダーを作成するコードの下に移動します。CordovFile依存関係のネストされたフォルダを作成する

私はそれが角の$ qサービスで動くことができると私はそれを試してみましたが、私はそれを試したが、動作していない、正直なところ私のコードは以下のとおりです。

コントローラ

if($scope.projectDetails.clientId == null && $scope.projectDetails.locationId == null){ 
      // insert a row in client table 
      var parameters=[$scope.projectDetails.clientName]; 
      NewProject.insertClient(parameters).then(function(result){ 
       $scope.projectDetails.clientId = result.insertId; 
       // create folder with this name in Renewate folder 
       ProjectCreated.createFolder("Renewate",$scope.projectDetails.clientName).then(function(resolve){ 
       // create new location 
       var parameters=[$scope.projectDetails.clientId, $scope.projectDetails.locationName]; 
       NewProject.insertLocation(parameters).then(function(result){ 
        $scope.projectDetails.locationId = result.insertId; 
        // create folder with this name in Renewate folder 
        var folderPath = "Renewate"+"/"+$scope.projectDetails.clientName; 
        ProjectCreated.createFolder(folderPath, $scope.projectDetails.locationName).then(function(resolve){ 
          var parameters=[$scope.projectDetails.projectName, $scope.projectDetails.locationId]; 
          NewProject.insertProject(parameters).then(function(result){ 
           $scope.projectDetails.projectId = result.insertId; 
           var folderPath = "Renewate"+"/"+$scope.projectDetails.clientName+"/"+$scope.projectDetails.locationName; 
           ProjectCreated.createFolder(folderPath, $scope.projectDetails.projectName).then(function(resolve){ 
            //$state.go('renewate3'); 
           }); 
          }); 
        }); 

       }); 
      }); 
      }); 
     } 

サービス

createFolder: function(folderPath, folderName){ 
      var q = $q.defer(); 
      $ionicPlatform.ready(function() { 
       $cordovaFile.createDir(cordova.file.externalRootDirectory+folderPath, folderName, true) 
       .then(function (success) { 
       q.resolve(result); 
       }, 
       function (error) { 
        q.reject(error); 
        alert("error"); 
       }); 
      }); 
      return q.promise; 
     }, 

私は間違っていますどこ私に知らせてください。

答えて

1

あなたのコードはうまくいくはずですが、実際ににエラーが発生していると言っているかどうかはわかりません。この実際のバージョンのコードです。エラーが発生した場合は、それが非常に乱雑なのでどこに正確に位置付けるのは難しいです。あなたのサービスでcreateFolder機能を見てみるとサービス

を書き換え

、あなたはとてもdeferred anti-patternと呼ばを実装しました。

$ionicPlatform.readyはすでに約束を返しています(documentation参照)ので、今のように新たな約束事を作成する必要はありません。それが失敗した場合は、代わりに$cordovaFile.createDirwill throw an errorこと

return $ionicPlatform.ready(function() { 
    return $cordovaFile.createDir(cordova.file.externalRootDirectory+folderPath, folderName, true); 
}); 

ノートのような既存の約束を返す必要がありますし、あなたが結果/返された値を使用していないので、あなたは単に、その後なし戻り、でエラーを処理することができますより高いレベル.catch()

と呼ばれ、それはすでにだ場合、それが直接解決されることから、私はベストプラクティスと何ではないのですが何であるかを言うことはイオンと十分慣れていないんだけど、それは$ionicPlatform.readycreateFolder()機能をラップするために本当に必要だ場合、私はになります準備ができました。約束して いいことをあなたの約束チェーンを書き換え

は、我々はあなたがコールバックを取る非同期機能の多くを持っているときに発生運命のcallback hell /ピラミッドを取り除くことができるということです。あなたがしたことは、人間の目のためにそれを本当に簡単にも読みやすくもしない入れ子式で約束を使うことです。関数をリファクタリングしてより読みやすいものにすることを検討することをお勧めします。

.then()から約束を返すと、その約束が解決されるまで待ってから次のものに進みます。 .then()ハンドラから値を返すと、ハンドラはラップされ、プロミスチェーン内の次の関数に解決されます。したがって、コードを以下のように書き直すことができます。

は機能

function createFirstFolder(result){ 
    $scope.projectDetails.clientId = result.insertId; 
    // create folder with this name in Renewate folder 
    return ProjectCreated.createFolder("Renewate", $scope.projectDetails.clientName); 
} 

function createNewLocation(){ 
    // create new location 
    var parameters= [$scope.projectDetails.clientId, $scope.projectDetails.locationName]; 
    return NewProject.insertLocation(parameters); 
} 


function createSecondLevelFolder(result){ 
    $scope.projectDetails.locationId = result.insertId; 
    // create folder with this name in Renewate folder 
    var folderPath = "Renewate"+"/"+$scope.projectDetails.clientName; 
    return ProjectCreated.createFolder(folderPath, $scope.projectDetails.locationName); 
} 

function insertNewProject(){ 
     var parameters = [$scope.projectDetails.projectName, $scope.projectDetails.locationId]; 
     return NewProject.insertProject(parameters); 
} 

function createNewProjectFolder(result){ 
    $scope.projectDetails.projectId = result.insertId; 
    var folderPath = "Renewate"+"/"+$scope.projectDetails.clientName + "/" + $scope.projectDetails.locationName; 
    return ProjectCreated.createFolder(folderPath, $scope.projectDetails.projectName); 
} 

を定義し、もっとたくさん目に簡単にだけでなく、デバッグしやすくする必要があります。この

if($scope.projectDetails.clientId == null && $scope.projectDetails.locationId == null){ 
    // insert a row in client table 
    var parameters=[$scope.projectDetails.clientName]; 

    NewProject.insertClient(parameters) 
     .then(createFirstFolder) 
     .then(createNewLocation) 
     .then(createSecondLevelFolder) 
     .then(insertNewProject) 
     .then(createNewProjectFolder) 
     .then(function(){ 
     //$state.go('renewate3'); ? 
     }) 
     .catch(function(err) { 
     //Handle error 
     }); 
} 

のようにそれらを呼びます!

+0

あなたはコードに関して読んだことを読んで理解していますが、修正するつもりですが、フォルダ作成のリクエストが送信されると、以下のコードの実行を開始して機能を終了します。 exit function – sandeepKumar

+0

前回の約束が解決された場合にのみコードが実行されますので、フォルダが実際に作成される前に '$ cordovaFile.createDir'が解決されない限り、あなたが言ったように続けることはできません。私が提案したものを試しましたか? 'createFolder'関数の変更方法を見てください。 –

+0

問題解決済み – sandeepKumar

関連する問題