2 回答

TA贡献1877条经验 获得超1个赞
考虑:
async function delay(n) {
return new Promise(r => setTimeout(r, n));
}
async function* asyncRange(a, b, d) {
while (a < b) {
await delay(d);
yield a++;
}
}
async function parallel(...ranges_and_delays) {
let iters = ranges_and_delays.map(t => asyncRange(...t));
while (iters.length) {
await Promise.race(iters.map(async it => {
let v = await it.next();
if (!v.done) {
console.log(v.value)
} else {
iters = iters.filter(k => k !== it)
}
}));
}
}
parallel([1, 5, 700], [10, 13, 500], [200, 205, 600])
这个想法是将范围生成器放在一个数组中,race在它们之间启动 a并打印先出现的内容。一旦发电机耗尽,将其从列表中删除。
请注意,这不是真正的并行计算(这在 Javascript 中是不可能的),只是一种模仿。

TA贡献1942条经验 获得超3个赞
我认为使用 setTimeout 解决问题的方法可能是:
function printParallel(val, delay)
{
setTimeout(function()
{
console.log(val);
}, delay);
}
function solution(inputData) {
var first = inputData.substring(0, 1);
var strArr = inputData.split(" ");
var strHashSplitArr = strArr[1].split("#");
for (var i = 0; i < strHashSplitArr.length; i++)
{
var loopInp = strHashSplitArr[i].split("*");
var maxVal = parseInt(loopInp[0]);
var modifier = parseInt(loopInp[1]);
if (first == 1)
{
for (var j = 1; j <= maxVal; j++)
{
console.log(j+modifier);
}
}
else if (first == 2)
{
for (var j = 1; j <= maxVal; j++)
{
printParallel(j+modifier, modifier);
}
}
}
}
因此,您将调用solution("1 3*21#2*10#4*1");并solution("2 1*100#2*20#3*50");执行示例,但这不会按预期输出,因为数字 1 的 100 的延迟太大而无法与数字 3 的打印混合。
编辑:
我想现在我明白了目标:你需要在每个 console.log 之间设置一个超时。这将按预期工作:
function printParallel(value, maxVal, modifier)
{
setTimeout(function()
{
console.log(value+modifier);
if (value < maxVal)
{
printParallel(++value, maxVal, modifier)
}
}, modifier);
}
function solution(inputData) {
var first = inputData.substring(0, 1);
var strArr = inputData.split(" ");
var strHashSplitArr = strArr[1].split("#");
for (var i = 0; i < strHashSplitArr.length; i++)
{
var loopInp = strHashSplitArr[i].split("*");
var maxVal = parseInt(loopInp[0]);
var modifier = parseInt(loopInp[1]);
if (first == 1)
{
for (var j = 1; j <= maxVal; j++)
{
console.log(j+modifier);
}
}
else if (first == 2)
{
printParallel(1, maxVal, modifier);
}
}
}
添加回答
举报