2017-04-04 58 views
0
function add(one, two, three) { 
    db.transaction(function (tx) { 
    tx.executeSql('INSERT INTO results (one, two, three) VALUES (?,?,?)', [one, two, three]); 
    }), function() { 
     console.log('add transaction ok'); 
    }); 
} 

$('#add').click(function() { 
    $("tr.row").each(function() { 
    var one = $(this).find("input.one").val(); 
    var two = $(this).find("input.two").val(); 
    var three = $(this).find("input.three").val(); 
    add(one, two, three); 
    }); 

    alert("Done"); 
}); 

嗨,我試圖點擊一個按鈕,它會在表的每一行中找到輸入值,並將這些值插入到數據庫中。錶行數量有時可能會有所不同,也許3其他時間可能是10.等待每個包含數據庫更新然後重定向

我已經使用jquery .each函數來執行此調用異步函數。整個過程起作用。我現在想要做的是當.each()函數完成alert()時。在代碼原樣的情況下,我首先收到警報,然後控制檯記錄事務是否正常,但我希望最後得到警報。

而不是理想的警報,我想直接到另一個頁面,但我不能如果交易不完成第一。

我看了下面的解決方案可用在這個鏈接https://salesforce.stackexchange.com/questions/12424/wait-for-each-contained-async-calls-to-complete-before-redirect。實施這個警報是馬上進行,交易通話甚至沒有開始。

回答

0

首先 - 我不確定你應該從客戶端寫入SQL。包含要添加的值的ajax請求應該發送到服務器,然後服務器應該更新數據庫,以便沒有人能夠破解您的查詢。所以你已經被警告過了。但這裏是如何在客戶端執行此操作的:

更新您的數據庫是一個異步任務。您需要提供一個回調或返回一個承諾時通知您更新完成:

function add(one, two, three) { 
    return new Promise(function (resolve, reject) { 
    db.transaction(function (tx) { 
     tx.executeSql('INSERT INTO results (one, two, three) VALUES (?,?,?)', [one, two, three]); 
    }, function (res) { 
     resolve(res); 
    }); 
    }); 
} 

$('#add').click(function() { 
    $("tr.row").each(function() { 
    var one = $(this).find("input.one").val(); 
    var two = $(this).find("input.two").val(); 
    var three = $(this).find("input.three").val(); 
    add(one, two, three).then(function (result) { 
     alert(result); 
    }); 
    }); 
}); 

我不知道你的db.transation如何處理失敗,但你需要有調用reject處理程序(如reject(err) )。

編輯:你可能想,如果你想等到所有的行更新,而不是反應他們,因爲他們應對考慮使用Promise.all(這可能是也可能不是一個很好的適合你的使用情況)

$('#add').click(function() { 
    var promiseList = $('tr.row').map(function() { 
     var $this = $(this); 
     var one = $this.find('input.one').val(); 
     var two = $this.find('input.two').val(); 
     var three = $this.find('input.three').val(); 

     return add(one, two, three); 
    }); 

    Promise.all(promiseList).then(function (resultRows) { 
     resultRows.forEach(function (rowTransactionResult, index) { 
      // do something with each result 
     }); 
    }) 
}); 
+0

哎,我正在做的PhoneGap移動應用程序,數據庫是設備,其中應用程序使用本地存儲。 編輯:即時嘗試使每個完成後的警報,你的解決方案是在每個? – JMa

+0

如果數據庫對設備是本地的,那麼通過這種方式這將起作用。我不知道你的應用程序是什麼或做什麼,所以我不能確定地說這種方法是否是一個好主意。 – Brian

0

您可以使用承諾來管理異步任務。

function add(one, two, three) { 
 
    return new Promise(function(resolve, reject) { 
 
    try { 
 
     setTimeout(function() { resolve([one, two, three]) }, 2000); 
 
    } catch (e) { 
 
     reject('oops!'); 
 
    } 
 
    }); 
 
} 
 

 
$('.button').on('click', function() { 
 
    add(1, 2, 3).then(function(res) { 
 
    alert(res); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button class="button">Click me!</button>