首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有承诺的函数发生器

有承诺的函数发生器
EN

Stack Overflow用户
提问于 2020-10-01 08:35:54
回答 2查看 180关注 0票数 2

我必须编写异步函数,以便:

代码语言:javascript
运行
复制
const myAsyncFunction = async(function* (promise) {
  const data = yield promise;
  console.log(data);
});

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

结果应该是-控制台:‘Hello!’

我认为这将是一个正确的实施:

代码语言:javascript
运行
复制
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不是一个函数

我找到了一些例子生成器转发它所做出的任何承诺的结果。

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

代码语言:javascript
运行
复制
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));
    }
   );
  }
 };
}

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

EN

回答 2

Stack Overflow用户

发布于 2020-10-01 08:58:41

我假设您的代码(mwe)如下所示:

代码语言:javascript
运行
复制
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。但是,当您调整以使用文章中复制的函数时:

代码语言:javascript
运行
复制
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中应用它。

代码语言:javascript
运行
复制
myAsyncFunction(Promise.resolve("Hello world")); // console: ‘Hello world!’`

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

根据您的下一篇文章,并试图了解您想要的内容,下面的内容将使用生成器函数中的控制台行打印字符串,但仍然不太确定您要实现的是什么:

代码语言:javascript
运行
复制
function async(gen) {
    return function (cb) {
        g = gen.apply(this, [cb])
        g.next()
        cb.then(res => {
            g.next(res);
        });
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-10-02 06:19:45

解决办法是

代码语言:javascript
运行
复制
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"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64151741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档