#javascript #node.js #return #generator #co
#javascript #node.js #Возврат #генератор #co
Вопрос:
Я хочу создать функцию, которая последовательно выполняет асинхронный код. Эта функция принимает параметры и возвращает обещание, которое разрешается с помощью объекта JavaScript. Он использует пакет co npm в сочетании с генераторами для «приостановки» асинхронного выполнения кода — последовательного запуска кода.
У меня есть следующая структура кода index.js
, и я пытаюсь получить результат от функции co, чтобы использовать его.
const co = require('co');
// various imports...
module.exports = function (url, param2, param3, param4) {
// Check if supplied url is reachable.
checkURL = () => {
return done => {
console.log(`Checking if '${url}' is reachable...`);
if (url.startsWith("http://")) {
http.get(url, _ => done(null, true))
.on('error', err => { throw new Error(`Address is unreachable. Error: ${err.message}`) });
} else if (url.startsWith("https://")) {
https.get(url, _ => done(null, true))
.on('error', err => { throw new Error(`Address is unreachable. Error: ${err.message}`) });
} else {
throw new Error("Address is not in the 'http(s)://' format.");
}
}
}
// various functions here ....
sendReport = () => {
return done => {
jsonCreatorFun((err, res) => {
if (err) {
throw new Error(`Error: ${err.message}`);
} else {
done(res, true);
}
});
}
}
// Using generators to 'sequentially' execute script
// as things are asynchronous here.
return co(function* () {
var rep;
try {
yield checkURL();
yield fun1();
yield fun2();
if (condition1) {
yield fun3();
}
if (condition2) {
yield fun4();
}
rep = yield sendReport();
} catch (err) {
handleError(err);
}
return rep;
});
}
Но когда я запускаю свой example.js
файл, из журналов консоли генератора не появляется никаких результатов.
const myFunc = require("./index")
myFunc(url, param2, param3, params).then(res => {
console.log("Printing result!");
console.log(JSON.stringify(res, null, 4));
})
Возможно ли это сделать?
Или даже лучше:
const res = myFunc(url, param2, param3, params);
console.log("Printing result!");
console.log(JSON.stringify(res, null, 4));
Комментарии:
1. » Он использует пакет co npm в сочетании с генераторами » — почему бы вам просто не использовать
async
/await
, как это делают все остальные с годами?2. Не
throw
делайте этого в асинхронных функциях. Вызовитеdone
обратный вызов с ошибкой или отклоните возвращенное обещание.3. Это старый фрагмент кода, который я нашел в Интернете и изменил его в соответствии со своими потребностями. Я попытался преобразовать код с помощью конвертера co / yield-to-async / await, найденного в Интернете, но по какой-то причине он не сработал..
4. Здесь не нужно ничего преобразовывать. Просто перепишите его с нуля.
5. Это было первое, что я попробовал, но я не смог заставить это работать.