带Promise的函数发生器

问题描述

我必须为以下对象编写 async 函数

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();
}

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

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

但是我没有类型错误 TypeError:myAsyncFunction不是函数

我找到了一个示例generator forwards with the results of any promises it has yielded

但是我不明白它是如何工作的,我的错误在哪里:

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));
    }
   );
  }
 };
}

请解释一下我做错了什么?

解决方法

我假设您的代码(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));
    }
   );
  }
 };
}

您没有得到错误。这是因为文章中的代码在异步定义中返回了一个函数,因此您可以将其与行中给出的args一起应用

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

在您最初的定义中,async定义不返回函数,因此上述调用失败。

在您的下一篇文章之后,尝试理解您想要的内容,以下内容将使用generator函数中的控制台行打印字符串,但仍然不确定您要实现的目标:

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

,

解决方案是

{{1}}