Javascript 仅来自异步函数的最后一个响应

Javascript 仅来自异步函数的最后一个响应,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,考虑下面的异步函数,它执行一些相对繁重的计算(在这种情况下只是休眠): 异步函数heavyFunc(内容) { log(`Starting${content}`); //睡眠2秒 等待新的承诺(resolve=>setTimeout(resolve,2000)); 日志(内容+“结束!”); } 重量级基金(“调用1”); 重量级基金(“第二次调用”); 重量级基金(“第三次调用”)由于异步函数调用一旦完成就无法停止,因此我们必须实现某种程度上的“id”系统,并仅为最后一次调用完成异步计算 下

考虑下面的异步函数,它执行一些相对繁重的计算(在这种情况下只是休眠):

异步函数heavyFunc(内容) { log(`Starting${content}`); //睡眠2秒 等待新的承诺(resolve=>setTimeout(resolve,2000)); 日志(内容+“结束!”); } 重量级基金(“调用1”); 重量级基金(“第二次调用”);
重量级基金(“第三次调用”)由于异步函数调用一旦完成就无法停止,因此我们必须实现某种程度上的“id”系统,并仅为最后一次调用完成异步计算

下面是一个简单的例子:

让asyncId=0;
异步函数heavyFunc(内容)
{
asyncId++;
设id=asyncId;
log(`Starting${content}`);
//等待2秒(这是你沉重的计算)
等待新的承诺(resolve=>setTimeout(resolve,2000));
//如果需要,可以在此处停止进一步的计算,以防止进一步的资源使用
如果(id!==asyncId)
{
日志(内容+“中止!”);
返回;
}
//再等2秒钟(这是您进一步的繁重计算)
等待新的承诺(resolve=>setTimeout(resolve,2000));
if(id==asyncId)
{
//这是最后一个电话!
asyncId=0;
日志(内容+“结束!”);
}
}
重量级基金(“调用1”);
重量级基金(“第二次调用”);

重量级基金(“第三次调用”)类似但功能更强的方式

//设置等待fn
const wait=t=>newpromise(r=>setTimeout(r,t));
//异步体
(异步()=>{
//
//
//主工作区
//
const startJob=(str,time)=>{
const internal=新承诺(异步(解析、拒绝)=>{
//设置检查器
常数chk=setInterval(()=>{
//如果是内部触发器
if(内部触发器){
//清除整型
清除间隔(chk);
//拒绝工作
log(`${str}已取消!`);
返回拒绝();
}
}, 50);
//在这里做计算
等待等待(时间);
//检查是否取消
if(internal.trigger)返回;
//完成
log(`${str}已完成!`);
决心(str);
});
//用cancel方法扩展内部
内部['cancel']=()=>{
internal.trigger=true;
}
//用触发器扩展内部
内部['trigger']=false;
//返回内部
返回内部;
};
//
//
//工人总数
//
常数wrk=3;
//当前作业实例的对象
让我们工作;
//经营工人
for(设i=1;i是实际的“繁重计算”异步,还是它们占用事件循环?