Javascript 在回拨中更新数组

Javascript 在回拨中更新数组,javascript,asynchronous,callback,Javascript,Asynchronous,Callback,我有以下两项职能: 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", "r

我有以下两项职能:

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;
}
我当前无法返回更新后的
num
值<代码>编号不断返回0(默认值),而不是新更新的值(1)


如何使其显示更新的值?如果我需要添加更多信息,请告诉我。

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

例如


下面是一个使用带有回调的异步函数传递异步结果的通用模式。什么是
team.filter
?您需要设计代码,使异步部分调用传递给封闭函数的
callback()
函数

如果过滤给您带来了问题,您可能想看看

(函数main(){
getNum(函数(err,abc){
console.log('thx播放'+abc)
});
})();
函数getNum(另一个回调函数){
//任何依赖于异步函数结果的代码都必须
//放在回调函数中
计数团队(职能部门(abc){
log('countTeams completed,abc='+abc);
var err=null;
另一个回调(err,abc);
});
};
函数countTeams(回调){
var-abc=0;
g、 dbm.transaction(“leagues”).objectStore(“leagues”).openCursor(null,“prev”).onsuccess=函数(事件){
var团队,i;
//我不知道这个过滤函数做什么,我假设它是同步的
团队过滤器({
属性:[“tid”、“缩写”、“地区”、“名称”、“cid”],
季节属性:[“winp”、“季后赛回合”],
季节:g季节
},职能(团队){
//第一轮按季后赛和winp对球队进行排序
团队。排序(功能(a、b){
如果(a.季后赛回合b.季后赛轮次){
返回1;
}
返回a.winp-b.winp;
});
abc+=1;
});
返回回调(abc);//0或n取决于team.filter的作用
};
};

因此我在
updateNum
函数的参数中添加了
cb
。接下来,我在
abc+=1
行下添加了
cb&&cb(abc)
。我将
getNum
函数更改为如下:
getBottomTeams(函数(abc){returnabc;})
现在,当我打开控制台时,我得到了
uncaughtreferenceerror:getNum没有定义。“我在这里犯了什么明显的错误吗?”根据你的解释,那个不能跟那个女孩说话的人说,这似乎很好。也许您可以重新发布修改代码的相关部分?
myFile.updateNum();
var number = myFile.getNum();
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
});
(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
  };
};