У меня небольшая проблема с моим кодом (Node.js). Я хочу иметь 2 файла app.js и state.js, я в основном создал два, чтобы попытаться решить возникшую у меня проблему.

Во втором файле «State.js» у меня есть функция, которая возвращает объект, и я задержал возврат на 10 секунд (с ощущением медленного интернета и т. д.). и я пытаюсь получить объект в файле app.js. но на данный момент это не работает. Я пробовал использовать обещание (async & await), но это возвращает ошибку на терминале, я также попытался запустить setInterval для отслеживания переменной i, которую нужно использовать при извлечении объекта для выполнения только тогда, когда у него есть данные, но это не работает также. Пожалуйста, мне нужна помощь как можно скорее.

Ниже приведены примеры кода для 2-го сценария.

=========================== Файл state.js =================== ====

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

module.exports = test;

========================== файл app.js (с использованием метода обещаний) ============== ==============

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

runNow();

================================== app.js (с использованием интервального подхода) ======= ===

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 Сен 2021 в 02:45

2 ответа

Лучший ответ

Вы должны использовать обещание или обратный вызов, чтобы выполнить то, что вы хотите здесь сделать.

Если я возвращаю что-то из функции callback функции setTimeout(callback, time), это фактически не возвращается функцией setTimeout.

Реализация setTimeout, вероятно, похожа на что-то подобное.

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

Желаемая реализация вашего файла state.js будет выглядеть следующим образом:

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 Сен 2021 в 00:10

Вам нужно создать обещание, чтобы await его дождался

Пытаться:

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 Сен 2021 в 00:14