鍍金池/ 問答/HTML/ js 取值 問題

js 取值 問題

        timeDown:function (time,interval,callback) {
            var timeCount=setTimeout(function () {
                (callback||new Function)();
                if(time===0){
                    clearTimeout(timeCount);
                }else{
                    time--;
                    console.log(time);
                    setTimeout(arguments.callee,interval);
                }
            },interval);
        }
以上實(shí)現(xiàn)一個倒計時功能

我希望這樣調(diào)用

A.timeDown(60,1000,function(){
    //do something
    $("#xx").text(time)  //我希望能夠獲取 正在變化的time
})

首先我這么設(shè)計應(yīng)該沒啥問題吧?
我的問題是 ,我能否取出 timeDown里不停變化的time作為callback里的參數(shù),應(yīng)該怎么實(shí)現(xiàn)?
(不考慮使用一個全局變量來接收或者傳遞time)

回答
編輯回答
夢一場

為什么不用setInterval

2017年3月31日 01:54
編輯回答
萌二代

代碼這樣寫:
arguments.callee不推薦使用,就像eval一樣

function timeDown(time,interval,callback) {
    var timeCount;
    var timeFun = function () {
        if (time === 0) {
            clearTimeout(timeCount);
        } else {
            time--;
            timeCount = setTimeout(timeFun, interval);
        }

        callback && callback(time);
    };

    setTimeout(timeFun, interval);
}

timeDown(60,1000,function(time){
    //do something
    console.log("time:"+time);
});
2018年8月30日 03:16
編輯回答
舊言

最好用setInterval,因?yàn)槊看?code>setTimeout都是一個新的定時器。
下面這個不需要在全局里面加變量,也不需要在A里面加其他東西。

timeDown: (function () {
    // 局部變量存放time值
    var _time = 0;
    function timeDown(time, interval, callback) {
        _time = time;
        // 開啟定時器
        var timer = setInterval(function () {
            // 執(zhí)行回調(diào)
            callback && callback();
            // 判斷次數(shù)
            if (--_time <= 0) {
                clearInterval(timer);
            }
        }, interval);
    }

    // 只暴露一個getTime給外部獲取time值
    timeDown.getTime = function () {
        return _time;
    }

    return timeDown;
})()

A.timeDown(60, 1000, function () {
    //do something
    console.log(A.timeDown.getTime())  // 使用timeDown.getTime獲取到time值
})
2017年7月31日 07:54
編輯回答
近義詞

給A一個time屬性
計時器中的time和A.time保持一致

2018年7月11日 00:37
編輯回答
懷中人
let timeDown = function(sum, interval, callback) {
  callback(sum);
  if(sum <= 0){ return }
  setTimeout(function(){
    timeDown(sum - interval, interval, callback);
  }, interval);
}

timeDown(10 * 1000, 1000, function(t){console.log(t)});
2018年1月4日 03:11
編輯回答
情殺
timeDown: function (time, interval, callback) {
        var timeCount = setTimeout(function () {
          (callback || new Function)(time);
          if (time === 0) {
            clearTimeout(timeCount);
          } else {
            time--;
            setTimeout(arguments.callee, interval);
          }
        }, interval);
      }
    }
    A.timeDown(60, 1000, function (time) {
      console.log(time) //我希望能夠獲取 正在變化的time
    })

這樣是否滿足題主的要求?

2017年12月23日 14:41
編輯回答
心癌
timeDown: function(time, interval, callback) {
    var timer = setInterval(function () {
        callback && callback(time)

        if (--timer < 0) {
            clearInterval(timer);
        }
    }, interval);
}
2017年6月27日 04:38
編輯回答
初心
var A = {
    time: 0,
    timeDown: function(time, interval, callback) {
        var that = this;
        that.time = time;
        var timeCount = setTimeout(function temp() {
            (callback || new Function)();
            if (that.time === 0) {
                clearTimeout(timeCount);
            } else {
                that.time--;
                console.log(that.time);
                setTimeout(temp, interval);
            }
        }, interval);
    }

};

A.timeDown(60, 1000, function() {
    //do something
    /*$("#xx").text(time) */ //通過 A.time 獲取實(shí)時的 time
});
2017年6月4日 19:10