我有一个问题,不知道如何解决它。
我正在开发一个小型Web应用程序。在应用程序中有一个发布系统 用户可以在哪里发表文章。现在,当用户登录时,我保存 他的电子邮件(每个用户都是独一无二的)在SQLite数据库中,当用户添加帖子时,我将所有数据从“发布表单”和他的电子邮件发送到服务器(然后我将其保存在mongoDB中)。问题是电子邮件始终未定义。以下是代码的相关部分:
function extractDetalisFromDB(){
db.transaction(queryDB, errorCB);
}
// Extracting the relevant data - there is always only one user in the db, hence the 'id=1'
function queryDB(tx) {
tx.executeSql('SELECT * FROM currentUser WHERE id=1', [], querySuccess, onError);
}
function querySuccess(tx, results) {
var len = results.rows.length;
currentUserName = results.rows.item(0).name;
currentUserEmail = results.rows.item(0).data;
}
currentUserName和currentUserEmail是全局变量。
function validateNewPost() {
// Here I validate the data from the form... works well.
if(error_appear === "false") {
extractDetalisFromDB();
console.log(currentUserName + ' ' + currentUserEmail); // This is undefined
var newPostJson = { writer: currentUserEmail, title: title.value, artist: artist.value,
albumOrSong: albumSong.value, content: content.value, genre:
genre.value};
$.post(URLAddress + '/addPost', newPostJson).done(function(data) {});
window.location = '#index';
}
}
问题是:
控制台日志和我发送给服务器的数据总是未定义的,因为它发生在从SQLite结束检索数据的回调函数之前。
我应该如何重构我的代码,以便从db中提取结束,然后才将数据发送到服务器? 我抬头看了这个问题,但找不到答案。
答案 0 :(得分:1)
这是JavaScript中的常见问题,因为它具有同步性。建议的解决方案是将回调传递给异步方法,并在成功时触发它。
因此,查看您的代码,您可以将其重新设计为
function extractDetailsFromDB(callback) {
db.transaction(function(tx) {
tx.executeSql('SELECT * FROM currentUser WHERE id=1', [], function(tx, results) {
var len = results.rows.length;
currentUserName = results.rows.item(0).name;
currentUserEmail = results.rows.item(0).data;
callback();
}, onError);
}, errorCb);
}
...
extractDetailsFromDb(function() {
console.log(currentUserName + ' ' + currentUserEmail); // This is undefined
var newPostJson = { writer: currentUserEmail, title: title.value, artist: artist.value,
albumOrSong: albumSong.value, content: content.value, genre:
genre.value};
$.post(URLAddress + '/addPost', newPostJson).done(function(data) {});
window.location = '#index';
});