Попытка возврата из согенератора runner в nodejs

#javascript #node.js #return #generator #co

#javascript #node.js #Возврат #генератор #co

Вопрос:

Я хочу создать функцию, которая последовательно выполняет асинхронный код. Эта функция принимает параметры и возвращает обещание, которое разрешается с помощью объекта JavaScript. Он использует пакет co npm в сочетании с генераторами для «приостановки» асинхронного выполнения кода — последовательного запуска кода.

У меня есть следующая структура кода index.js , и я пытаюсь получить результат от функции co, чтобы использовать его.

 const co = require('co');
// various imports...

module.exports = function (url, param2, param3, param4) {

  
  // Check if supplied url is reachable.
  checkURL = () => {
    return done => {
      console.log(`Checking if '${url}' is reachable...`);
      if (url.startsWith("http://")) {
        http.get(url, _ => done(null, true))
          .on('error', err => { throw new Error(`Address is unreachable. Error: ${err.message}`) });
      } else if (url.startsWith("https://")) {
        https.get(url, _ => done(null, true))
          .on('error', err => { throw new Error(`Address is unreachable. Error: ${err.message}`) });
      } else {
        throw new Error("Address is not in the 'http(s)://' format.");
      }
    }
  }

// various functions here ....

  sendReport = () => {
    return done => {
      jsonCreatorFun((err, res) => {
        if (err) {
          throw new Error(`Error: ${err.message}`);
        } else {
          done(res, true);
        }
      });
    }
  }

  // Using generators to 'sequentially' execute script
  // as things are asynchronous here.
  return co(function* () {
    var rep;
    try {
      yield checkURL();
      yield fun1();
      yield fun2();
      if (condition1) {
        yield fun3();
      }
      if (condition2) {
        yield fun4();
      }
      rep = yield sendReport();
    } catch (err) {
      handleError(err);
    }
    return rep;
  });

}
 

Но когда я запускаю свой example.js файл, из журналов консоли генератора не появляется никаких результатов.

 const myFunc = require("./index")

myFunc(url, param2, param3, params).then(res => {
    console.log("Printing result!");
    console.log(JSON.stringify(res, null, 4));
    })
 

Возможно ли это сделать?

Или даже лучше:

 const res = myFunc(url, param2, param3, params);
console.log("Printing result!");
console.log(JSON.stringify(res, null, 4));
 

Комментарии:

1. » Он использует пакет co npm в сочетании с генераторами » — почему бы вам просто не использовать async / await , как это делают все остальные с годами?

2. Не throw делайте этого в асинхронных функциях. Вызовите done обратный вызов с ошибкой или отклоните возвращенное обещание.

3. Это старый фрагмент кода, который я нашел в Интернете и изменил его в соответствии со своими потребностями. Я попытался преобразовать код с помощью конвертера co / yield-to-async / await, найденного в Интернете, но по какой-то причине он не сработал..

4. Здесь не нужно ничего преобразовывать. Просто перепишите его с нуля.

5. Это было первое, что я попробовал, но я не смог заставить это работать.