带有Promise的函数生成器



我必须为编写异步函数

const myAsyncFunction = async(function* (promise) {
const data = yield promise;
console.log(data);
});
myAsyncFunction(Promise.resolve("Hello world")); // console: ‘Hello world!’`

结果应该是-console:"你好,世界!">

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

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

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

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

你不会得到错误。这是因为文章中的代码在异步定义中返回了一个函数,因此您可以使用行中给出的参数来应用它

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

最新更新