2016-08-08 51 views
0

私のデータベースにはまだ問題がありますが、データベースを開くには時間がかかりますが、このタスクが完了するまで待ってください。AngularJS +次のタスクを実行する前にタスクが終了するのを待つ方法

次のタスクを開始する前に、データベースが正しく開かれるまで角度待ちをする方法はありますか?

ありがとう、 キリスト教徒。


更新日:2016年8月8日 - すべての答えのための3時13分午後

感謝。私が見ることができるように、約束($ q)の私の最初のアイデアは正しかったですが、

私のアプリは私のメインファイルであるapp.jsを持っています。 InitDBを呼び出すだけです。これにより、データベースが開かれます。次に、CreateTablesを呼び出す必要があります。存在しない場合は、テーブルを作成します。

残りのアプリケーションは4ページ(テンプレート)で分割されています。すべてのページには独自のコントローラーがあります。

したがって、データベースを初期化し、テーブルを作成してからデータベースを操作し、別のコントローラで使用するという考えがありました。

私はいつも私のものをすべてinit.DBの.then()のapp.jsに入れる必要があるので、これはうまくいかないでしょうか?

これは多分、これは...

おかげで、 キリスト教の私はミスの多くを行う理由で、私の最初のAngularJSアプリです。

+1

あなたは約束で動作し、データベースが起動しているときにそれを解決することができます:https://docs.angularjs.org/api/ng/service/$q –

答えて

0

Angularのコアコンセプトの1つは、サービス/工場で働いています。これらの仕組みと使い方についての豊富なドキュメントとブログがありますが、基本的な考え方は、アプリケーション全体で共有されるデータとメソッドを処理するシングルトンの "コントローラ"です。約束と組み合わせて使用​​すると、データベースとの通信を管理するサービスを簡単に作成できます。

angular 
    .module('myApp') 
    .service('DBService', DBService) 
    .controller('Ctrl1', Ctrl1) 
    .controller('Ctrl2', Ctrl2) 
    .controller('Ctrl3', Ctrl3) 
    .controller('Ctrl4', Ctrl4); 

DBService.$inject = ['$q']; 
function DBService($q) { 
    var DBService = this; 
    var DBServiceDeferred = $q.defer(); 
    DBService.ready = DBServiceDeferred.promise; 

    // a service is only initialized once, so this will only ever be run once 
    (function() { 
    init(); 
    })(); 

    function init() { 
    // you can use promise chaining to control order of events 
    // the chain will halt if any function is rejected 
    initDB() 
    .then(createTablesUnlessExist) 
    .then(setDbReady); 
    } 

    function initDB() { 
    var deferred = $q.defer(); 
    // simulate async db initialization 
    $timeout(function() { 
     deferred.resolve(); 
     // or reject if there is an error 
     // deferred.reject(); 
    }, 5000); 
    return deferred.promise; 
    }; 

    function createTablesUnlessExist() { 
    //create tables if needed (only happens once) 
    var deferred = $q.defer(); 
    // simulate async table creation 
    $timeout(function() { 
     deferred.resolve(); 
     // or reject if there is an error 
     // deferred.reject(); 
    }, 5000); 
    return deferred.promise; 
    } 

    function setDbReady() { 
    DBServiceDeferred.resolve(); 
    } 
} 

これで、DBの設定が完了し、もうこれ以上のことは心配する必要はありません。サービスを使用する任意のコントローラからDBにアクセスできます。 DBが初期化され、テーブルが作成されるまで、どのクエリも実行されません。

Ctrl1.$inject = ['DBService', '$q']; 
function Ctrl1(DBService, $q) { 
    $q.when(DBService.ready).then(function() { 
    DBService.conn.query("Select something"); 
    }); 
} 
Ctrl2.$inject = ['DBService', '$q']; 
function Ctrl2(DBService, $q) { 
    $q.when(DBService.ready).then(function() { 
    DBService.conn.query("Select something"); 
    }); 
} 
Ctrl3.$inject = ['DBService', '$q']; 
function Ctrl3(DBService, $q) { 
    $q.when(DBService.ready).then(function() { 
    DBService.conn.query("Select something"); 
    }); 
} 
Ctrl4.$inject = ['DBService', '$q']; 
function Ctrl4(DBService, $q) { 
    $q.when(DBService.ready).then(function() { 
    DBService.conn.query("Select something"); 
    }); 
} 
+0

こんにちはJoelCDoyle、これはintrestingsの答えの一つです私は読む。ありがとうございました!しかし今私はいくつかの他の質問があります:1.あなたの工場では、init()関数を直接呼び出します。これは安全ですか?これは、アプリが起動すると、そのこと自体が邪魔されていることを意味します。アプリが終了したら、どうやって閉じますか? 2.私はすべてのデータベースロジック(CRUD)を工場に入れなければならないと考えましたが、コントローラから呼び出すことはできますか?これは簡単な例のためか、このベストプラクティスですか? 3.コントローラーで、DBServiceが準備できない場合、タスクは待機するか、エラーを生成しますか?無限ループ? – cjs1976

+0

こんにちは。私はあなたのヒントすべてを使って私の工場を完全にリルートするが、setDbReady()関数についてはいつもエラーが出る。 DBServiceの代わりに、私はPersistenceServiceを採用しました。だから、私はPersistenceService.ready.resolve();を実行します。私はエラーTypeErrorを取得します:PersistenceService.ready.resolveは関数ではありません...任意のアイデア?ありがとう、クリスチャン。 – cjs1976

+0

あなたは正しいです、実際にデモの目的のためだけに、コントローラ内からのクエリを作成する必要はありません。コントローラがクエリを作成するために呼び出すことができる、サービス内にメソッドを作成したいとします。私のコードに間違いがあります。ここに訂正された作業コードのプランナーがあります。コンソールを見て操作の順序を確認してください:https://plnkr.co/edit/AWtM0lF2491fFUtqQYaz?p=preview –

0

Angularはサービス$ qを提供します。関数を非同期で実行し、処理が完了したときに戻り値(または例外)を使用するのに役立つサービス。同じものについてはhttps://docs.angularjs.org/api/ng/service/$qのドキュメントを参照してください。 $ qは、基本的に約束の概念を中心に展開しています。 AngularJSの約束は、組み込みの$ qサービスによって提供されます。

0

接続が確立されているかどうかをチェックするメソッドを記述します。これはtrueまたはfalseを返します。

app.controller('MainCtrl', function($scope, httpq) { 
    http.get('server call method') 
     .then(function(data) { 
     if(data.conn==true) 
     // do what u want 
     //write other calls 
     }) 
     .catch(function(data, status) { 
     console.error('error', response.status, response.data); 
     }) 

    }); 
0

あなたは

例$ qをライブラリを使用することができます。

app.service("githubService", function ($http, $q) { 
var deferred = $q.defer(); 

this.getAccount = function() { 
    return $http.get('https://api.github.com/users/haroldrv') 
     .then(function (response) { 
      // promise is fulfilled 
      deferred.resolve(response.data); 
      // promise is returned 
      return deferred.promise; 
     }, function (response) { 
      // the following line rejects the promise 
      deferred.reject(response); 
      // promise is returned 
      return deferred.promise; 
     }) 
    ; 
}; 

});サービスの上に使用

app.controller("promiseController", function ($scope, $q, githubService) { 
githubService.getAccount() 
    .then(
     function (result) { 
      // promise was fullfilled (regardless of outcome) 
      // checks for information will be peformed here 
      $scope.account = result; 
     }, 
     function (error) { 
      // handle errors here 
      console.log(error.statusText); 
     } 
    ); 

})。

関連する問題