簡體   English   中英

在 setInterval 中返回值

[英]Return value inside a setInterval

我想在 setInterval 中返回一個值。 我只想以時間間隔執行某些操作,這是我嘗試過的:

function git(limit) {
    var i = 0;
    var git = setInterval(function () {
        console.log(i);
        if (i === limit - 1) {
            clearInterval(git);
            return 'done';
        }
        i++;
    }, 800);
}

var x = git(5);
console.log(x);

它不起作用。 有沒有其他辦法?

我要做的是為特定的時間間隔做一個動畫。 然后當我達到限制時(例如5x blink by $().fadeOut().fadeIn() ),我想返回一個值。

這是應用程序

function func_a(limit) {
    var i = 0;
    var defer = $.Deferred();
    var x = setInterval(function () {
        $('#output').append('A Running Function ' + i + '<br />');

        if (i == limit) {
            $('#output').append('A Done Function A:' + i + '<br /><br />');
            clearInterval(x);
            defer.resolve('B');
        }
        i++;

    }, 500);
    return defer;
}

function func_b(limit) {
    var c = 0;
    var defer = $.Deferred();
    var y = setInterval(function () {
        $('#output').append('B Running Function ' + c + '<br />');

        if (c == limit) {
            $('#output').append('B Done Function B:' + c + '<br /><br />');
            clearInterval(y);
            defer.resolve('A');
        }
        c++;

    }, 500);
    return defer;
}

func_a(3).then( func_b(5) ).then( func_a(2) );

這運行不正常,它應該打印A,A,A,Done A,B,B,B,B,B,Done B,A,A,Done A但在這里它被打亂了,似乎延遲runs all function not one after the other但同時。 這就是我問這個問題的原因,因為我想返回return defer; 在我的if...

if (i == limit) {
     $('#output').append('A Done Function A:' + i + '<br /><br />');
     clearInterval(x);
     defer.resolve('B');
     // planning to put return here instead below but this is not working
     return defer;
}

您是否希望它等到間隔結束? 這對運行時來說真的很痛苦,你會阻塞整個頁面。 現在 JS 中的很多東西都是異步的,所以你必須使用回調、promise 或類似的東西:

function git(limit, callback) {
    var i = 0;
    var git = setInterval(function () {
        console.log(i);
        if (i === limit - 1) {
            clearInterval(git);
            callback('done');
        }
        i++;
    }, 800);
}

git(5, function (x) {
  console.log(x);
});

使用承諾它看起來像這樣:

function git(limit, callback) {
    var i = 0;
    return new Promise(function (resolve) {
        var git = setInterval(function () {
            console.log(i);
            if (i === limit - 1) {
                clearInterval(git);
                resolve('done');
            }
            i++;
        }, 800);
    });
}

git(5)
  .then(function (x) {
    console.log(x);

    return new Promise(function (resolve) {
        setTimeout(function () { resolve("hello"); }, 1000);
    });
  })
  .then(function (y) {
    console.log(y); // "hello" after 1000 milliseconds
  });

編輯:為承諾創建添加了偽示例

編輯 2:使用兩個承諾

編輯 3:修復 promise.resolve

嘗試獲取對git函數的callback

function git(limit,callback) {
    var i = 0;
    var git = setInterval(function () {
        console.log(i);
        if (i === limit - 1) {
            clearInterval(git);
            callback('done') // now call the callback function with 'done'
        }
        i++;
    }, 800);
}

var x = git(5,console.log); // you passed the function you want to execute in second paramenter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM