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('L35_DB', ['$ionicPlatform','$cordovaFile','$cordovaSQLite', function($ionicPlatform, $cordovaFile,$cordovaSQLite) {
var L35_DB = {db_start : false};
//-------------------------------------
DB_READY = new Promise(function(resolve,reject){
console.log("query");
if( L35_DB.db_start ){console.log("b"); resolve("Stuff worked!"); }
else{
var filename='fileWithDB.db';
$ionicPlatform.ready(function() {
if( window.cordova ){
return window.plugins.sqlDB.copy(filename, 0,
function(info){ loadDB(filename).then( function(){ console.log("First load", info);resolve("DB loaded?"); }) },
function(info){ loadDB(filename).then( function(){ console.log("Other loads", info); resolve("DB loaded?"); }) }
);
}
});
}
});
//-------------------------------------
// Load the file
function loadDB(filename){
var loading = new Promise(function(resolve,reject){
db = window.sqlitePlugin.openDatabase(
{name: filename, location: 'default'},
function(){
console.log("loadDB success"); // <--- fired
L35_DB.db_start = true; // true, so next call we don't do all this
resolve("DB ready loading");
},
function(err){ reject(err);}
);
});
return loading;
}
//-------------------------------------
// Query -
var _query = function(query,values){
if( !L35_DB.db_start ){
console.error("DB not init");
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("SELECT * FROM systems").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]