如何解决带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}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。