菜鸟教程小白 发表于 2022-12-11 18:36:58

javascript - 创建自定义事件,例如 ionicPlatform.ready() 或 document.ready()


                                            <p><p>我有一个使用数据库的 Ionic 应用程序。我想用一个文件的内容填充这个数据库。<br/>
这部分我开始工作了。我想创建一个 <code>DB.ready()</code> 事件,就像 <code>$ionicPlatform.ready()</code> 或 <code>document.ready()</code> 一样,我需要等到数据库加载完毕后再查询。</p>

<p>我对 Ionic 和 Promises 的概念相当陌生,所以它可能很简单。 </p>

<p>我已经让它在 Android 中工作,但 iOS 在查询中不断返回错误,并显示“<em>someTablename 不存在</em>”。我已经放置了多个 <code>console.log()</code>,根据这些一切都很好。</p>

<p>谁能告诉我我做错了哪一部分,或者在这种情况下更常见的另一种方法(再次,我是新手,所以不知道什么是常见的)?<br/>
我希望每次查询都会记录“<code>query</code>”,但它没有这样做,这很重要吗?</p>

<pre><code>// L35_DB - Databaseclass for apps
.factory(&#39;L35_DB&#39;, [&#39;$ionicPlatform&#39;,&#39;$cordovaFile&#39;,&#39;$cordovaSQLite&#39;, function($ionicPlatform, $cordovaFile,$cordovaSQLite) {
    var L35_DB = {db_start : false};
    //-------------------------------------
    DB_READY = new Promise(function(resolve,reject){
      console.log(&#34;query&#34;);
      if( L35_DB.db_start ){console.log(&#34;b&#34;); resolve(&#34;Stuff worked!&#34;); }
      else{
            var filename=&#39;fileWithDB.db&#39;;
            $ionicPlatform.ready(function() {
                if( window.cordova ){
                  return window.plugins.sqlDB.copy(filename, 0,
                        function(info){ loadDB(filename).then( function(){ console.log(&#34;First load&#34;, info);resolve(&#34;DB loaded?&#34;); }) },
                        function(info){ loadDB(filename).then( function(){ console.log(&#34;Other loads&#34;, info); resolve(&#34;DB loaded?&#34;); }) }
                  );
                }
            });
      }
    });
    //-------------------------------------
    // Load the file
    function loadDB(filename){
      var loading = new Promise(function(resolve,reject){
            db = window.sqlitePlugin.openDatabase(
                                        {name: filename, location: &#39;default&#39;},
                                        function(){
                                          console.log(&#34;loadDB success&#34;); // &lt;--- fired
                                          L35_DB.db_start = true; // true, so next call we don&#39;t do all this
                                          resolve(&#34;DB ready loading&#34;);
                                        },
                                        function(err){ reject(err);}
                                    );
      });
      return loading;
    }
    //-------------------------------------
    // Query -
    var _query = function(query,values){
      if( !L35_DB.db_start ){
            console.error(&#34;DB not init&#34;);
            return false;
      }
      else if( window.cordova ){
            values = values || [];
            var actualQuery = new Promise(function(resolve,reject){
                db.executeSql(query, values, resolve, reject);
            })
            return actualQuery;
      }
    }
    //-------------------------------------
    return {
      query : _query
    };
}])
</code></pre>

<p>在我的整个应用程序中我都这样做:</p>

<pre><code>DB_READY.then(function () {
L35_DB.query(&#34;SELECT * FROM systems&#34;).then(function (result) {
    // Something something something darkside
})
})
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>经过大量测试和挖掘,结果是 <a href="https://github.com/an-rahulpandey/cordova-plugin-dbcopy" rel="noreferrer noopener nofollow"><code>window.plugins.sqlDB.copy()</code></a>是罪魁祸首。</p>

<p>第二个值,位置,可以更改。它默认为 <code>0</code>,但对于 iOS,它必须是 <code>2</code>。在此更改之后,一切都按预期工作。 </p>

<p><em>这个函数应该为 Android 和 iOS 预加载数据库,假设它实际上这样做有点太早了。</em></p></p>
                                   
                                                <p style="font-size: 20px;">关于javascript - 创建自定义事件,例如 ionicPlatform.ready() 或 document.ready(),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41714863/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41714863/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: javascript - 创建自定义事件,例如 ionicPlatform.ready() 或 document.ready()