Генератор функций с обещанием

Мне нужно написать асинхронную функцию для:

       const myAsyncFunction = async(function* (promise) {
  const data = yield promise;
  console.log(data);
});

myAsyncFunction(Promise.resolve("Hello world")); // console: ‘Hello world!’`

результат должен быть - console: 'Hello world!'

Я подумал, что это будет правильная реализация:

       function async(cb) {
  return cb().next();
}

const myAsyncFunction = async(function* (promise) {
  const data = yield promise;
  console.log(data);
});

myAsyncFunction(Promise.resolve("Hello world")); // console: ‘Hello world!’`

но я нахожу ошибку типа:TypeError: myAsyncFunction не является функцией

Я нашел примерный генератор с результатами любых обещаний, которые он дал

но я не могу понять, как это работает и в чем моя ошибка:

       function async(cb) {
 return function () {
  let generator = cb.apply(this, arguments);

  function handle(result) {
   if (result.done) return Promise.resolve(result.value);

   return Promise.resolve(result.value).then(
    function (res) {
      return handle(generator.next(res));
    },
    function (err) {
      return handle(generator.throw(err));
    }
   );
  }
 };
}

пожалуйста, объясните, что я делаю не так?

2 ответа

Я предполагаю, что ваш код (mwe) выглядит так:

const myAsyncFunction = async(function* (promise) {
  const data = yield promise;
  console.log(data);
});

myAsyncFunction(Promise.resolve("Hello world")); // console: ‘Hello world!’`

function async(cb) {
  return cb().next();
}


И когда вы его запускаете, вы действительно получаете ошибку TypeError: myAsyncFunction is not a function. Однако, если вы настроите использовать скопированную функцию из статьи:

const myAsyncFunction = async(function* (promise) {
  const data = yield promise;
  console.log(data);
});

myAsyncFunction(Promise.resolve("Hello world")); // console: ‘Hello world!’`

function async(cb) {
 return function () {
  let generator = cb.apply(this, arguments);

  function handle(result) {
   if (result.done) return Promise.resolve(result.value);

   return Promise.resolve(result.value).then(
    function (res) {
      return handle(generator.next(res));
    },
    function (err) {
      return handle(generator.throw(err));
    }
   );
  }
 };
}

Вы не получите ошибку. Это связано с тем, что код из статьи возвращает функцию в определении async, и, таким образом, вы можете применить ее с аргументами, указанными в строке

myAsyncFunction(Promise.resolve("Hello world")); // console: ‘Hello world!’`

В вашем первоначальном определении async определение не возвращает функцию, поэтому приведенный выше вызов не выполняется.

Следуя вашему следующему посту и пытаясь понять, что вы хотите, следующий код напечатает строку, используя строку консоли в функции генератора, но все еще не совсем уверен, чего вы пытаетесь достичь:

function async(gen) {
    return function (cb) {
        g = gen.apply(this, [cb])
        g.next()
        cb.then(res => {
            g.next(res);
        });
    }
}

Решение

function async(cb) {
  return async function () {
    const generator = cb.apply(this, arguments);
    const nextResult = generator.next();
    const value = await nextResult.value;
    generator.next(value);
  };
}

const myAsyncFunction = async(function* (promise) {
  const data = yield promise;
  console.log(data);
});

myAsyncFunction(Promise.resolve("Hello World"));
Другие вопросы по тегам