2013-08-27 58 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 
    }; 
};