2013-08-27 95 views
0

我有以下兩個功能:更新呼叫裏的數組回到

var abc; 

function updateNum() { 
    abc=0; 
    g.dbm.transaction("leagues").objectStore("leagues").openCursor(null, "prev").onsuccess = function (event) { 
     var teams, i; 

     team.filter({ 
      attrs: ["tid", "abbrev", "region", "name", "cid"], 
      seasonAttrs: ["winp", "playoffRoundsWon"], 
      season: g.season 
     }, function (teams) { 
      // Sort teams by playoffs and winp, for first round 
      teams.sort(function (a, b) { 
       if (a.playoffRoundsWon < b.playoffRoundsWon) { 
        return -1; 
       } 
       if (a.playoffRoundsWon > b.playoffRoundsWon) { 
        return 1; 
       } 
       return a.winp - b.winp; 
      }); 
      abc+=1; 
     }); 
    }; 
} 

function getNum() { 
    return abc; 
} 

我所要做的是更新的回調函數內的變量ABC,然後返回。我通過首先在另一個文件中調用updateNum()函數來完成此操作。然後我一個變量分配給的getNum()

值這裏是一個示例代碼會是什麼樣子:

myFile.updateNum(); 
var number = myFile.getNum(); 

我現在無法返回的num更新值。 number保持返回0(默認值)而不是新更新的值(即1)。

我怎樣才能讓它顯示更新的值?如果我需要添加更多信息,請讓我知道。

回答

1

那麼,如果updateNum是異步的,它將不得不將回調作爲參數,以便您可以在更新號碼時得到通知。

E.g.

var num = 0; 

function updateNumAsync(callback) { 
    setTimeout(function() { 
     num = 1; 
     callback && callback(num); //call the callback if provided 
    }, 500); 
} 

updateNumAsync(function (num) { 
    console.log(num); //updated num 
}); 
+0

問題,所以我在'updateNum'函數的參數添加'cb'。接下來,我在'abc + = 1'行下面添加了'cb && cb(abc)'。我將'getNum'函數修改爲如下:'getBottomTeams(function(abc){return abc;});'現在,當我打開控制檯時,我得到'未捕獲的ReferenceError:getNum未定義'。我在這裏犯了一些明顯的錯誤嗎? – DemCodeLines

+0

@TheGuyWhoCouldn'tTalkToTheGirl從你的解釋,它似乎很好。也許你可以重新發布你的修改過的代碼的相關部分? – plalx

+0

它的工作,因爲它應該,所以謝謝你的幫助:) – DemCodeLines

1

這是一個使用異步函數和回調傳遞異步結果的通用模式。什麼是team.filter?您需要設計代碼,以便異步部分調用傳遞給封閉函數的callback()函數。

如果過濾給你,你可能想看看https://github.com/caolan/async#filterarr-iterator-callback

(function main(){ 
    getNum(function(err, abc){ 
    console.log('thx for playing '+abc) 
    }); 
})(); 

function getNum(anotherCallback) { 
    // Whatever code relies on the result of an asynchronous function must be 
    // placed inside the callback function 
    countTeams(function(abc){ 
    console.log('countTeams completed, abc='+abc); 
    var err = null; 
    anotherCallback(err, abc); 
    }); 
}; 

function countTeams(callback){ 
    var abc=0; 
    g.dbm.transaction("leagues").objectStore("leagues").openCursor(null, "prev").onsuccess = function (event) { 
    var teams, i; 
    // I don't know what this filter function does, I am assuming it's synchronous 
    team.filter({ 
     attrs: ["tid", "abbrev", "region", "name", "cid"], 
     seasonAttrs: ["winp", "playoffRoundsWon"], 
     season: g.season 
    }, function (teams) { 
     // Sort teams by playoffs and winp, for first round 
     teams.sort(function (a, b) { 
     if (a.playoffRoundsWon < b.playoffRoundsWon) { 
      return -1; 
     } 
     if (a.playoffRoundsWon > b.playoffRoundsWon) { 
      return 1; 
     } 
     return a.winp - b.winp; 
     }); 
     abc+=1; 
    }); 
    return callback(abc); // 0 or n depending on what team.filter does 
    }; 
};