2012-05-23 72 views
1

道歉,但我似乎要繞圈。Jquery:控制功能流延遲

這個過程是相當staightforward

  1. SaveButtonClicked

  2. 通話功能進行離線數據庫事務更新記錄

  3. 檢查是否在線(/ *用於埃德諾頓例子這樣做* /)

  4. 如果在線調用select transaction來獲取所有updat編輯記錄的選擇負載結果

  5. 成功到一個數組

  6. 調用web服務與陣列

到目前爲止,我一直試圖控制與 $ .Deferred流,dothis =推遲.pipe(...), .queue [但這些似乎基於一個元素而不是函數完成], 將函數放入一個數組中,

in tes ting控制檯總是在'建築物陣列'之前寫'陣列'

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,隊列,回調......黑暗魔法?

回答

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) 
     }) 
    ) 
} 

的幾點思考

  • selectrows功能(我認爲這不是你想要的,因爲arrvals爲空)有一個空push();
  • 我重構了代碼以使用更少的全局變量/函數:現在,在返回promise的函數中聲明瞭延遲對象;
  • arrvals現在在selectrows()函數中定義,並且您可以在解決延期任務時傳遞它;
  • areweonline()函數已從我的示例中刪除(因爲您沒有在代碼段中的任何地方使用它);
  • when()現在正在尋找承諾(而不是延期)。

注:我沒有嘗試執行代碼,但是希望這有助於反正

+0

FWIW,沒有必要環繞'deferA.resolve(功能)' - 'deferA.resolve'爲由於函數對它內部的延遲對象有一個封閉的引用,因此裸函數引用將起作用。 – Alnitak

+0

感謝您的指導@ F.Calderan非常感謝您的幫助,對錯過推(工作)位(速度打字)的道歉,areweonline只是在調用selectrows之前進行的一次檢查(如果不在線,則不需要調用selectrows)。再次歡呼 – user1412045