2016-06-02 10 views
0


Ich habe diesen Code:JQuery etwas tun, alle paar Sekunden, es sei denn alle Werte im Objekt sind wahre

var obj = { 
    eins : false, 
    zwei : false, 
    drei : false 
}; 

$.each(obj, function (k, v) { 
    if (!v) { 
    console.log(false); 
    } 
}); 

Nun, was ich versuche, Folgendes zu tun ist: Überprüfen Sie, ob alle Werte in der obj sind wahr. Wenn dies der Fall ist, versuchen Sie es erneut.

habe ich versucht, mit setInterval und $ .each Unordnung aber gelänge es nicht zu synchron laufen zu lassen ..

Antwort

2

Einfache Schleife, um zu sehen, ob das Objekt alle wahr ist und ein if/else, um den Schritt zu bestimmen, ist alles was benötigt wird.

var obj = { 
 
    eins : false, 
 
    zwei : false, 
 
    drei : false 
 
}; 
 

 
//function to call to see if code is updated 
 
function check() { 
 

 
    //Check to see that every property in the object is true 
 
    var isValid = Object.keys(obj).every(function (key) { 
 
    return obj[key]; 
 
    }); 
 
    
 
    //if true, do what you need to do 
 
    if(isValid) { 
 
     document.body.style.backgroundColor = "green"; 
 
    } else { //not true, than run check again 
 
     window.setTimeout(check, 500); //next check is half a second 
 
    } 
 
    
 
} 
 

 
check(); //initialize the checking 
 

 
//A way to flip the data for the demo 
 
document.querySelector("button").addEventListener("click", function() { 
 
    obj = { 
 
     eins : true, 
 
     zwei : true, 
 
     drei : true 
 
    }; 
 
});
<button>Set</button>

0

Sie müssen nicht an allen $ .each() verwenden. denn (... in ...) funktioniert großartig innerhalb einer Funktion, die in einem vordefinierten Intervall aufgerufen wird.

var obj = { 
    eins: false, 
    zwei: false, 
    drei: false, 
}; 

var id = setInterval(function() { 
    for(var key in obj) { 
     if(obj[key] === false) return; 
    } 
    // No property was false 
    clearInterval(id); 
    // do anything you want here 
}, 1000); 

Wenn Sie einen Wert nach der Prüfung abrufen müssen, um Versprechen Klasse aussehen :)

0

nur eine einfache Demo erstellt, was Sie versuchen ..

var obj = { 
 
    eins: false, 
 
    zwei: false, 
 
    drei: false 
 
}; 
 

 
var doStuffTimer = setInterval(function() { 
 
    $.each(obj, function(k, v) { 
 
     if (!v) { 
 
     $('#logger').append('<p>obj.eins = ' + obj.eins + ' obj.zwei = ' + obj.zwei + ' obj.drei = ' + obj.drei + '</p>'); 
 
     } 
 
    }); 
 
    $('#logger').append("<p>--------------</p>"); 
 
    }, 3000), //check every 3 seconds 
 
    
 
    flagTimer = setInterval(function() { /* below timer is for demo purpose only */ 
 
    if (!obj.eins) { 
 
     obj.eins = true; 
 
    } else if (!obj.zwei) { 
 
     obj.zwei = true; 
 
    } else if (!obj.drei) { 
 
     obj.drei = true; 
 
    } else { 
 
     $('#logger').append('<p>Final Result: obj.eins = ' + obj.eins + ' obj.zwei = ' + obj.zwei + ' obj.drei = ' + obj.drei + '</p>'); 
 
     clearInterval(flagTimer); 
 
     clearInterval(doStuffTimer); //clear the doStuffTimer; we dont want to keep the timer running 
 
    } 
 
    }, 5000); //change the flag every 5 seconds.. just for demo purpose
p { 
 
    margin: 2px; 
 
    padding: 0; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="logger"></div>

1

können Sie die Array.prototype.every Methode verwenden:

var allTrue = Object.keys(obj).every(function(key) { 
    return obj[key] === true; 
}); 
0

Hier ist ein weiterer Ansatz:

var obj = { 
 
    eins : false, 
 
    zwei : false, 
 
    drei : false 
 
}; 
 

 
function allTrue (obj){ 
 
    var all_true = true; 
 
    Object.keys(obj).forEach(function(key){ 
 
    if(obj[key] === false) all_true = false; 
 
    }); 
 
    return all_true; 
 
} 
 

 
function doSomething(){ 
 
    // Do something 
 
    var key_; 
 
    Object.keys(obj).forEach(function(key){ 
 
    if(obj[key] === false){ 
 
     key_ = key; 
 
    } 
 
    }); 
 
    obj[key_] = true; 
 
    console.log('iteration'); 
 
    if(!allTrue(obj)) doSomething(); 
 
} 
 

 
doSomething();

Verwandte Themen