@Scorpiored88

Как вернуть из асинхронных функции результат?

Кам мне из этого кода вернуть ress

function enabled_api (conf){
    var ress ;
    var config = {
        host: conf.host,
        username: conf.us,
        password: conf.pa
    };
    exec(config, '/ip service set api disabled=no', function (error, response) {
        ress = error ? 'error' : 'ok';
        console.log('ress is ', ress)
        return ress
    })
    console.log('ress again is ', ress)


}

var ccc = {host:'1.1.1.1',us:'user,pa:'123'}
console.log(enabled_api(ccc))


Через асинхронность, когда делаю console.log(enabled_api(ccc)) выдает undefined
  • Вопрос задан
  • 383 просмотра
Решения вопроса 1
HoHsi
@HoHsi
Во первых вы вызываете асинхронную версию exec, есть ее синхронный собрат: execsync

Во вторых, тут не обойдется без промисов / коллеков / Async/Await.
В текущей сборке, я бы рекомендовал использовать промисы, но сам я уже перешел на Async/Await c бабелем.
function enabledApi(conf) {
  const config = {
    host:     conf.host,
    username: conf.us,
    password: conf.pa
  };

  return new Promise((resolve, reject) => {
    exec(config, '/ip service set api disabled=no', (error, response) => {
      const res = error ? 'error' : 'ok';
      console.log(`res is ${res}`);

      if (error) {
        reject(error);
      } else {
        resolve(response);
      }
    });
  });
}

const config = {
  host:'1.1.1.1',
  us:'user',
  pa:'123'
};

enabledApi(config)
.then((res) => {
  console.log(`ress again is ${res}`);
})
.catch((err) => {
  console.error(`OMG! ${err.toString()}`);
});


Или все же с Async, но вам понадобится babel
function enabledApi(conf) {
  const config = {
    host:     conf.host,
    username: conf.us,
    password: conf.pa
  };

  return new Promise((resolve, reject) => {
    exec(config, '/ip service set api disabled=no', (error, response) => {
      const res = error ? 'error' : 'ok';
      console.log(`res is ${res}`);

      if (error) {
        reject(error);
      } else {
        resolve(response);
      }
    });
  });
}

(async () => {
  const config = {
    host:'1.1.1.1',
    us:'user',
    pa:'123'
  };

  const res = await enabledApi(config);

  console.log(res);
})()
.catch((err) => {
  console.error(`OMG! ${err.toString()}`);
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
abyrkov
@abyrkov
JavaScripter
Вы ее не возвращаете. Лол
Ответ написан
Комментировать
mannaro
@mannaro Куратор тега JavaScript
Умею профессионально гуглить
Для используются callback-функции, которые (как правило) передаются последним аргументом. Также, давно уже придумали promise, который позволяет упростить эту задачу.

jsbin.com/zifuyotina/edit?js,console
Ответ написан
Комментировать
Весь смысл асинхронности в том, что вы не возвращаете результат в основной скрипт, вы не дожидаетесь этого результата. Все, что вы хотите сделать с результатом - нужно делать в пределах колбэк функции.
Ответ написан
Комментировать
@lem_prod
конкретно по скрипту писать не буду, потому что не совсем понял, что та происходит, но попробую объяснить по поводу асинхронности, когда запускается асинхронная функция, в нее передаются агрументы(их количество бывает разным, в зависимости от функции) и последним аргументом callback-функция, в переводе, обратный звонок, вот эта функция имеет доступ к результатам выполнения предыдущей, и она может делать с этим результатом, что нужно, либо вернуть результат в общий поток, где он обработается, передаль другой функции, отослать результат браузеру и т.д. ...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы