1

申し訳ありませんが、私は輪になって回っているようです。

プロセスはかなり簡単です

  1. SaveButtonClicked

  2. 関数を呼び出してオフラインデータベーストランザクションを実行し、レコードを更新します

  3. オンラインかどうかを確認します(/*これを行うためにEdNortonの例を使用しました*/)

  4. オンライン呼び出しの場合、トランザクションを選択して、更新されたすべてのレコードをフェッチします

  5. 選択したロードの結果が配列に成功する

  6. 配列を使用してWebサービスを呼び出す

これまで、$。Deferred、dothis = defer.pipe(...)、.queueを使用してフローを制御しようとしました[ただし、これらは関数の完了ではなく要素に基づいているようです]、関数を配列に配置します、

テストでは、コンソールは常に「ビルドアレイ」の前に「アレイビルド」を書き込みます

var arrvals = [];
var deferA , deferB;
function updatedb(params){
    db.transaction('update....',[params],updateOk,updateFail)
}
function updateOk(){
    deferA.resolve()
}
function updateFail(){
    deferA.reject()
}
function areweonline(){
    $.ajax(.....) 
}
function selectrows(){
    db.transaction('update....',[params],buildarray,selectFail)
}
function buildarray(transaction,results){
    console.log('building array')
    for(i=0;i<=results.rows.length;i++){
        var row = results.rows.item(i);
        var job = {};
        job.text = row["testtext"]
        arrvals.push(job);
    }
    deferB.resolve()
}
function selectFail(){
    deferB.reject();
}
function callwebservice(vals){
    $.ajax(....) /* this bit is working fine*/
}
function SaveButtonClicked(){
    deferA = $.Deferred(); 
    deferB = $.Deferred();
    $.when(deferA).then(
        console.log('update completed')
        $.when(deferB).then(function(){
            console.log('array built')
            callwebservice(arrvals)
        })
    )
}

では、最善のアプローチは何でしょうか?$ .Deffered、キュー、コールバック...ダークマジック?

4

1 に答える 1

1

このようにしてみてください

function updatedb(params) {
    var deferA     = $.Deferred(),
        updateOk   = function() { deferA.resolve(); },
        updateFail = function() { deferA.reject(); }

    db.transaction('update....',[params],updateOk,updateFail);
    return deferA.promise();
}


function selectrows() {

    var arrvals = [];

    var deferB     = $.Deferred(),
        buildarray = function (transaction, results) {
            console.log('building array')
            for(i = 0; i <= results.rows.length; i++){
                var row = results.rows.item(i);
                var job = {};
                job.text = row["testtext"]
                arrvals.push();
            }
            deferB.resolve(arrvals);
        },
        selectFail = function() {
            deferB.reject();
        };

    db.transaction('update....',[params],buildarray,selectFail);
    return deferB.promise();
}


function callwebservice(vals) { $.ajax(....) /* this bit is working fine*/ }


function SaveButtonClicked(){

    $.when(updatedb('your params here')).then(
        console.log('update completed')
        $.when(selectrows()).then(function(arr){
            console.log('array built');
            callwebservice(arr)
        })
    )
}

いくつかの考え

  • 空のpush()onselectrows関数があります ( が空であるため、必要なものではないと思いますarrvals)。
  • グローバル変数/関数の使用を減らすようにコードをリファクタリングしました。遅延オブジェクトは、Promise を返す関数内で宣言されるようになりました。
  • arrvals関数で定義されselectrows()、遅延タスクを解決するときに渡すことができます。
  • areweonline()関数は私の例から削除されました (スニペットのどこにも使用していないため)。
  • when()現在、promise を探しています (deferred ではありません)。

注:コードを実行しようとはしませんでしたが、とにかくこれが役立つことを願っています

于 2012-05-23T09:02:30.200 に答える