J'ai un petit problème avec mon code (Node.js). Je veux avoir 2 fichiers app.js et state.js, j'ai essentiellement créé les deux pour essayer de résoudre le problème que j'ai.

Sur le deuxième fichier "State.js" j'ai une fonction qui renvoie un objet et j'ai retardé le retour de 10 secondes (Avec impression d'un internet lent, etc). et j'essaie de récupérer l'objet dans le fichier app.js. mais pour le moment, ça ne marche pas. J'ai essayé d'utiliser promise (async & wait) mais cela renvoie une erreur sur le terminal, j'ai également essayé d'exécuter un setInterval pour surveiller la variable i à utiliser pour récupérer l'objet à exécuter uniquement lorsqu'il contient des données mais cela ne fonctionne pas également. S'il vous plaît, j'ai besoin d'aide dès que possible.

Vous trouverez ci-dessous les exemples de code pour le scénario 2.

=========================== fichier state.js =================== ====

function test(val){
    setTimeout(() => {
        return {
            code: 0,
            value: val
        }
    }, 10000);
}

module.exports = test;

========================== fichier app.js (en utilisant l'approche promesse)============== ==============

async function runNow(){
    let v = await t('some string');
    console.log(v.value)
}

runNow();

================================== app.js (en utilisant l'approche d'intervalle) ======= ===

function runNow(){
    let engine = setInterval(() => {
        let v = t('some string');
        if(v === null || v === undefined){
            console.log(v);
        }else{
            clearInterval(engine);
            console.log(v.value);
        }
    }, 5000);
    // console.log(v.value);
}

runNow();
0
Octagod 22 sept. 2021 à 02:45

2 réponses

Meilleure réponse

Vous devez utiliser la promesse ou le rappel pour accomplir ce que vous voulez faire ici.

Si je renvoie quelque chose de la fonction callback de setTimeout(callback, time), il n'est en fait pas renvoyé par la fonction setTimeout.

L'implémentation de setTimeout est probablement similaire à quelque chose comme ça.

function setTimeout(callback, time, ...args) {
    // After the given time it executes the callback
    callback(...args);
}

L'implémentation souhaitée de votre fichier state.js serait la suivante :

function testWithPromise(val) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({
        code: 0,
        value: val,
      });
    }, 5000);
  });
}

function testWithCallback(val, callback) {
  setTimeout(() => {
    callback({
      code: 0,
      value: val,
    });
  }, 3000);
}

// export the function


// use it in other modules as
testWithCallback("callback_approach", console.log);
testWithPromise("promise_approach").then(console.log);

// or with an async function
async function getValue() {
  const value = await testWithPromise("async_promise");
  console.log(value);
}

//getValue();
1
h-sifat 22 sept. 2021 à 00:10

Vous devez créer une promesse pour que await l'attende

Essayer:

function test(val) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve({code: 0, value: val});
    }, 10000);
  });
}

async function runNow() {
  let v = await test('someString');
  console.log(v.value);
}
1
Leshawn Rice 22 sept. 2021 à 00:14