如何从函数中多次产生价值?
How to yield value multiple times from function?
所以我正在做的是,我有 2 个文件,一个包含将生成令牌的脚本,第二个文件处理该令牌。
问题是第二个记录令牌的脚本只会记录收到的第一个令牌。
这是我处理令牌的方式:
const first_file = require("./first_file.js");
first_file.first_file().then((res) => {
console.log(res);
});
显然那是行不通的,因为它没有更新为更新的值。
first_file = async () => {
return new Promise(async (resolve, reject) => {
//Generating the token
(async () => {
while (true) {
console.log("Resolving...");
resolve(token);
await sleep(5000);
resolved_token = token;
}
})();
});
};
module.exports = { first_file };
我在这里做的是,我尝试做一个 while..loop
以便我继续解析令牌。但它没有,有什么方法可以直接导出变量,这样任务会更容易吗?
如果我对你的问题理解正确,你想多次解决承诺,而这与模块无关...
但是你对 JavaScript 中的 promise 理解有误...
你不能两次解决一个承诺。
发电机
但是您可以从函数生成新值,这种类型的函数也称为 generator,其中函数可以重新进入其上下文(类似于 async/await
)并使用 [=13 产生结果=]关键字。
通常在for..of
循环中使用生成器。它有 next()
从生成器产生下一个值的方法...
让我们看一个例子:
const delay = ms => new Promise(res => setTimeout(res.bind(null, ms), ms));
async function* generator() {
yield 'yield result from generator!'
for (let ms = 100; ms <= 300; ms += 100) {
yield 'delay: ' + await delay(ms) + ' ms';
}
yield delay(1000).then(() => 'you can also yield promise!');
}
async function main() {
const gen = generator();
console.log('1st', (await gen.next()).value);
for await (const ms of gen) {
console.log(ms)
}
}
main()
注意函数后面的*
,这样我们就知道这个函数是一个生成器,用async
关键字this就是Async Generator.
生成器非常有用。像:按需生成值,像管道一样传递数据!,可以 return 从函数中获取无穷无尽的值等...
回调
这种老派方法在节点中大量使用,您可以在其中传递回调函数作为参数。
示例:
const delay = ms => new Promise(res => setTimeout(res.bind(null, ms), ms));
async function callback(fn) {
fn('yield result from callback!');
for (let ms = 100; ms <= 300; ms += 100) {
fn('delay: ' + await delay(ms) + ' ms');
}
await delay(1000);
fn('yield asynchronously!');
}
callback(value => console.log(value));
这种方法会产生各种麻烦的问题,例如:创建函数作用域、控制流灾难、没有 break
关键字等...
我不推荐这种方法。
所以我正在做的是,我有 2 个文件,一个包含将生成令牌的脚本,第二个文件处理该令牌。
问题是第二个记录令牌的脚本只会记录收到的第一个令牌。
这是我处理令牌的方式:
const first_file = require("./first_file.js");
first_file.first_file().then((res) => {
console.log(res);
});
显然那是行不通的,因为它没有更新为更新的值。
first_file = async () => {
return new Promise(async (resolve, reject) => {
//Generating the token
(async () => {
while (true) {
console.log("Resolving...");
resolve(token);
await sleep(5000);
resolved_token = token;
}
})();
});
};
module.exports = { first_file };
我在这里做的是,我尝试做一个 while..loop
以便我继续解析令牌。但它没有,有什么方法可以直接导出变量,这样任务会更容易吗?
如果我对你的问题理解正确,你想多次解决承诺,而这与模块无关...
但是你对 JavaScript 中的 promise 理解有误...
你不能两次解决一个承诺。
发电机
但是您可以从函数生成新值,这种类型的函数也称为 generator,其中函数可以重新进入其上下文(类似于 async/await
)并使用 [=13 产生结果=]关键字。
通常在for..of
循环中使用生成器。它有 next()
从生成器产生下一个值的方法...
让我们看一个例子:
const delay = ms => new Promise(res => setTimeout(res.bind(null, ms), ms));
async function* generator() {
yield 'yield result from generator!'
for (let ms = 100; ms <= 300; ms += 100) {
yield 'delay: ' + await delay(ms) + ' ms';
}
yield delay(1000).then(() => 'you can also yield promise!');
}
async function main() {
const gen = generator();
console.log('1st', (await gen.next()).value);
for await (const ms of gen) {
console.log(ms)
}
}
main()
注意函数后面的*
,这样我们就知道这个函数是一个生成器,用async
关键字this就是Async Generator.
生成器非常有用。像:按需生成值,像管道一样传递数据!,可以 return 从函数中获取无穷无尽的值等...
回调
这种老派方法在节点中大量使用,您可以在其中传递回调函数作为参数。
示例:
const delay = ms => new Promise(res => setTimeout(res.bind(null, ms), ms));
async function callback(fn) {
fn('yield result from callback!');
for (let ms = 100; ms <= 300; ms += 100) {
fn('delay: ' + await delay(ms) + ' ms');
}
await delay(1000);
fn('yield asynchronously!');
}
callback(value => console.log(value));
这种方法会产生各种麻烦的问题,例如:创建函数作用域、控制流灾难、没有 break
关键字等...
我不推荐这种方法。