Генератор функций с обещанием
Мне нужно написать асинхронную функцию для:
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"));