Jump to content
php.lv forumi

Async metodes apturēšana


Nils Graustiņš

Recommended Posts

Problēma: atveram async socket un sākam sūtīt datus.

var isRecording; // globāls

Kamēr sockets ir vaļā, viss notiek.

async function startAudioRecording(ws)
{
// ...
}
function streamStart() {
    isRecording = true;
    $(".mice").addClass('recording');
    const ws = new WebSocket(url);
    ws.onopen = async () => {
        const authPayload = JSON.stringify({
            "appID": AppId,
            "timestamp": timeStamp,
            "appKey": appKey,
        });
        ws.send(authPayload);
        startAudioRecording(ws);
    };

    socketInterval = setInterval(() =>
    {
        if (isRecording === false)// un te ir gļuks - nav false pēc stop() //
        {
            if (recorder.state !== 'inactive')
            {
                recorder.stop();
                recorder.clear();
                stream.getTracks().forEach(track => track.stop());
                ws.close();
            }
        }
    },500);
  
    ws.onmessage = function (event)
    {
     // ...
    } 
}

 

Tagad UI uzdevums ir pateikt stop(); No UI  izpilda:

function streamStop(){
isRecording = false;
 // etc.
}

Bet async pa to laiku griežas un cik jūtu, viņam ir pie kājas, ka kāds tur variablis ir nomainīts sinhronā metodē. Reizēm izpildas, reizēm nē.
Ir sajūta, ka randomā ja trāpa tad izpildas:  isRecording === false.
Ja atslēdz asinhrono daļu, viss notiek perfekti - streamStart(), streamStop(). Konsolē lieliski redzams strādājošs intervāls, kā apturas un atkal sākas.
Nekādu kļūdu konsolē nav. Redzams, ka pēc streamStop() izsaukšanas intervāls turpinās un isRecording gļuka vietā ir true.

Vai ir idejas?

Link to comment
Share on other sites

Neredzot pārējo, ir pāris lietas, kas no sākuma jāpārbauda - vai nu recorder.state == 'inactive', tāpēc otrais if's neizpildās, vai arī isRecording kaut kur vēl tiek pārrakstīts.

Kā arī darbību secība - tas, ka kaut kas JS ir asinhrons, nenozīmē, ka tas tiek izpildīts asinhroni, jo JS tik un tā visu izpilda vienā pavedienā. Saliec logus, lai redzētu, kas kādā secībā tiek izpildīts, vai asinhronā daļa netiek aizkavēta dēļ kāda cita koda.

Link to comment
Share on other sites

On 1/21/2021 at 10:16 PM, Nils Graustiņš said:

Problēma: atveram async socket un sākam sūtīt datus.


var isRecording; // globāls

Kamēr sockets ir vaļā, viss notiek.


async function startAudioRecording(ws)
{
// ...
}
function streamStart() {
    isRecording = true;
    $(".mice").addClass('recording');
    const ws = new WebSocket(url);
    ws.onopen = async () => {
        const authPayload = JSON.stringify({
            "appID": AppId,
            "timestamp": timeStamp,
            "appKey": appKey,
        });
        ws.send(authPayload);
        startAudioRecording(ws);
    };

    socketInterval = setInterval(() =>
    {
        if (isRecording === false)// un te ir gļuks - nav false pēc stop() //
        {
            if (recorder.state !== 'inactive')
            {
                recorder.stop();
                recorder.clear();
                stream.getTracks().forEach(track => track.stop());
                ws.close();
            }
        }
    },500);
  
    ws.onmessage = function (event)
    {
     // ...
    } 
}

 

Tagad UI uzdevums ir pateikt stop(); No UI  izpilda:


function streamStop(){
isRecording = false;
 // etc.
}

Bet async pa to laiku griežas un cik jūtu, viņam ir pie kājas, ka kāds tur variablis ir nomainīts sinhronā metodē. Reizēm izpildas, reizēm nē.
Ir sajūta, ka randomā ja trāpa tad izpildas:  isRecording === false.
Ja atslēdz asinhrono daļu, viss notiek perfekti - streamStart(), streamStop(). Konsolē lieliski redzams strādājošs intervāls, kā apturas un atkal sākas.
Nekādu kļūdu konsolē nav. Redzams, ka pēc streamStop() izsaukšanas intervāls turpinās un isRecording gļuka vietā ir true.

Vai ir idejas?

Otrais if() ir tikai tāpēc, lai plūsmu neslēgtu pie neatbilstoša statusa un nerastos kļūda.  Ne tajā ir problēma.

Link to comment
Share on other sites

On 1/26/2021 at 5:59 PM, Nils Graustiņš said:

Otrais if() ir tikai tāpēc, lai plūsmu neslēgtu pie neatbilstoša statusa un nerastos kļūda.  Ne tajā ir problēma.

T.i. tu abās atbildēs atradi vienu vietu, kas neatbilst tavam kodam, bet pārējo nolēmi izlaist?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...