2016-11-07 5 views
5

में चलते समय धीमी गति से दो बार दौड़ते हैं मेरे पास एक वेबपैप है जो सेटटाइमआउट का उपयोग करके फ़ेड इन/आउट संक्रमणों के साथ ऑडियो चलाता है। यह अच्छी तरह से ज्ञात है कि क्रोम और अन्य ब्राउज़र एक निष्क्रिय (या पृष्ठभूमि) टैब में चलने पर सेटटाइमआउट निष्पादन को थ्रॉटल करते हैं। इसलिए इस समस्या को हल करने के लिए, मैं इस स्क्रिप्ट का उपयोग करता हूं (https://github.com/turuslan/HackTimer) जो कि वेब वर्कर्स का उपयोग करने के लिए टाइमर एपीआई को पैच करता है। यह वॉल्यूम फ़ेडिंग संक्रमण को पृष्ठभूमि में चलाने की अनुमति देता है ताकि टैब को सक्रिय होने पर भी उन्हें हमेशा एक ही समय में निष्पादित और पूरा किया जा सके। यह क्रोम में बहुत अच्छा काम करता था, लेकिन अब मैंने देखा है कि क्रोम के संस्करण 54 (और शायद पहले संस्करण) में, वेब वर्कर्स को निष्क्रिय टैब में चलते समय धीमे से दो बार निष्पादित किया जा रहा है। यह समस्या नहीं होती है और फ़ायरफ़ॉक्स और यहां तक ​​कि IE11 के साथ पूरी तरह से काम करता है!क्रोम v54 में वेब वर्कर्स एक निष्क्रिय टैब

क्या यह क्रोम बग है? या यह इरादा व्यवहार है? क्या इस मुद्दे पर कोई अन्य कामकाज है? मैं यह नहीं चाहता कि वेबपैप को एक अलग विंडो में खोला जाए, ताकि यह कोई विकल्प न हो।

यहाँ एक प्रदर्शन है: https://jsfiddle.net/2614xsj8/1/

// Open Chrome console and run this then wait a few seconds to see 
 
// it is executing on time. Then open or switch to a new tab and wait 
 
// a few seconds. Come back to see how much slower the setTimeout 
 
// function was being called even when using HackTimer which patches 
 
// the Timer API to use Web Workers 
 

 
var rate = 1000; 
 
var start = new Date().getTime(); 
 
var func = function() { 
 
    var now = new Date().getTime(); 
 
    var time = now - start; 
 
    var status = Math.abs(rate - time) <= 50 ? "on time" : (time/rate) + " times slower"; 
 
    console.log("executed in [" + time + "] milliseconds. " + status); 
 
    start = now; 
 
    setTimeout(func, rate); 
 
}; 
 
setTimeout(func, rate);
<script src="https://cdn.rawgit.com/turuslan/HackTimer/master/HackTimer.js" type="text/javascript"></script>

+1

आप [ऑडियो एपीआई] का उपयोग माना जाता है (https://www.html5rocks.com (ताकि आपकी साइट एक वैध SSL प्रमाणपत्र की जरूरत है)/en/ट्यूटोरियल/WebAudio/परिचय /)? समय बहुत अधिक दानेदार है और मुझे नहीं लगता कि यह टैब स्विचिंग से प्रभावित है। मेरे पास एक समान समस्या थी [यहां] (http://stackoverflow.com/q/27162254/677526)। –

+1

@ jedd.ahyoung मैं प्लेबैक के लिए ऑडियो एपीआई का उपयोग कर रहा हूं और इस तरह, लेकिन समय के लिए इसका उपयोग करने पर विचार नहीं किया। मैं यह देखने के लिए अपनी समय क्षमताओं को देखूंगा कि फीका इन/आउट संक्रमण प्राप्त करने के लिए प्रत्येक कुछ मिलीसेकंड को बढ़ाने/घटाने के लिए उपयुक्त होगा या नहीं। –

उत्तर

1

Task Scheduler सबसे अच्छा तरीका यह करने के लिए तो आप समय समाप्ति या अंतराल लेकिन एक विशिष्ट तिथि पर वास्तव में नहीं है का उपयोग करना होगा

लेकिन इसके बजाय सेवा श्रमिकों का उपयोग करने की आवश्यकता है ... जो एक बमर है। cuz तो आपकी साइट भी आदेश सेवा श्रमिकों को चलाने के लिए सजग किए जाने की जरूरत है

// https://example.com/serviceworker.js 
this.ontask = function(task) { 
    alert(task.data.message); 
    console.log("Task scheduled at: " + new Date(task.time)); 
    // From here on we can write the data to IndexedDB, send it to any open windows, 
    // display a notification, etc. 
} 

// https://example.com/webapp.js 
function onTaskAdded(task) { 
    console.log("Task successfully scheduled."); 
} 

function onError(error) { 
    alert("Sorry, couldn't set the alarm: " + error); 
} 

navigator.serviceWorker.ready.then(function(serviceWorkerRegistration) { 
    serviceWorkerRegistration.taskScheduler.add(Date.now() + (10 * 60000), { 
     message: "It's been 10 minutes, your soup is ready!" 
    }).then(onTaskAdded, onError); 
}); 
+1

हम्म। सौभाग्य से मैं एक वैध एसएसएल प्रमाण पत्र का उपयोग कर रहा हूँ, तो यह मेरे लिए एक अच्छा विकल्प हो सकता है। मैं इसे आज़माकर परिणामों के साथ वापस पोस्ट करूंगा। –

+0

यह https://www.w3.org/TR/task-scheduler/ कोड की एक सटीक प्रति है जो वास्तव में क्रोम में काम नहीं करता है। – Jakub

संबंधित मुद्दे