gpt4 book ai didi

javascript - 如何从函数中多次产生值(value)?

转载 作者:行者123 更新时间:2023-12-03 20:23:02 25 4
gpt4 key购买 nike

所以我正在做的是,我有 2 个文件,一个包含将生成 token 的脚本,第二个文件处理该 token 。
问题是记录 token 的第二个脚本只会记录收到的第一个 token 。
这就是我处理 token 的方式:

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这样我就可以继续解析 token 。但它没有,有没有办法可以直接导出变量,这样任务会更容易?

最佳答案

如果我正确理解你的问题,你想多次解决 promise ,这与模块无关......
但是你对 JavaScript 中的 Promise 有一些误解……
你不能两次解决一个 promise 。
发电机
但是您可以从函数中生成新值,这种类型的函数也称为 generator , 函数可以重新进入其上下文(类似于 async/await )并使用 yield 产生结果关键词。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()

请注意 * after函数,这样我们就知道这个函数是一个生成器,有 async关键字是 Async Generator .
生成器非常有用。比如:按需生成值,像管道一样传递数据!可以从函数中返回无穷无尽的值等等......
打回来
这种在节点中大量使用的老派方法,您将回调函数作为参数传递。
例子:

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关键字等...
我不推荐这种方法。

关于javascript - 如何从函数中多次产生值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67244150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com