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();

我目前无法返回 的更新值numnumber不断返回 0(默认值)而不是新更新的值(即 1)。

我怎样才能让它显示更新的值?如果我需要添加更多信息,请告诉我。

4

2 回答 2

1

好吧,如果updateNum是异步的,它必须将回调作为参数,以便在更新数字时通知您。

例如

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
});
于 2013-08-27T02:47:03.873 回答
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
  };
};
于 2013-08-27T03:11:45.787 回答