Javascript 如何写Promise.race的反面

Javascript 如何写Promise.race的反面,javascript,Javascript,我有3个异步函数 我必须创建一个函数,在参数中获取这3个函数和一些回调函数,并在最后一个异步函数结束时调用该回调函数,然后将该函数的回调参数的值发送给回调函数 这3个函数有1个回调参数: const async1 = (cb) => { setTimeout(() => { cb(1); }, 4000); }; const async2 = (cb) => { setTimeout(() => { cb(13);

我有3个异步函数

我必须创建一个函数,在参数中获取这3个函数和一些回调函数,并在最后一个异步函数结束时调用该回调函数,然后将该函数的回调参数的值发送给回调函数

这3个函数有1个回调参数:

const async1 = (cb) => {
    setTimeout(() => {
        cb(1);
    }, 4000);
};
const async2 = (cb) => {
    setTimeout(() => {
        cb(13);
    }, 6000);
};
const async3 = (cb) => {
    setTimeout(() => {
        cb(5);
    }, 3000);
};
const someCallback = (val) => console.log(val);
 yourXFunction(async1, async2, async3, someCallback);
 // for this case, should print 13

您可以轻松实现这样的功能:

function yourXFunction(…args){
常量cb=args.pop()
const cbCreator=i=>value=>{
if(done.add(i).size==args.length){
cb(价值)
}
}
const done=新集合
参数映射((fn,i)=>{
fn(一)
})
}
但请注意

  • 避免使用回调来支持承诺(或者更好的是,
    async
    /
    wait
  • 由于JS的单线程性,竞相“异步”可能会产生意想不到的结果
以下是您的代码的预期版本:

const wait=t=>newpromise(rs=>setTimeout(rs,t))
常量async1=()=>wait(4000)。然后(()=>1)
常量async2=()=>wait(6000)。然后(()=>13)
常量async3=()=>wait(3000)。然后(()=>5)
函数promisifiedYourXFunction(…args){
返回新承诺(解决=>{
const cbCreator=i=>value=>{
if(done.add(i).size==args.length){
解析(值)
}
}
const done=新集合
参数映射((fn,i)=>{
fn().然后(cbCreator(i))
})
})
}
promisifiedYourXFunction(异步1、异步2、异步3)
.then(console.log)

您尝试了什么,有什么问题吗?欢迎使用堆栈溢出!请拿着(你得到了一枚徽章!)通读一下,尤其是你最好的选择是做你的研究,做相关的主题,然后试一试。如果你在做了更多的研究和搜索后陷入困境,无法摆脱困境,请发布一份你的尝试,并明确指出你陷入困境的地方。人们会乐意帮忙的。另外:
yourXFunction
建议这是家庭作业。在寻求家庭作业方面的帮助时,表现出你的努力是特别重要的。旁注:你的问题是异步完成的函数,通常在几年前被称为“异步函数”或“异步函数”。由于ES2015定义了
async
函数(使用
async
关键字的函数),因此短语“async function”具有与上述不匹配的更具体含义。以防你在搜索时发现关于他们的信息,而这会让你感到困惑。