Javascript 如何检测函数返回值是否被丢弃?

Javascript 如何检测函数返回值是否被丢弃?,javascript,Javascript,用例:这允许区分用户使用的是基于承诺的样式还是回调样式,因此我可以避免重复计算。我用ES6代理在已完成的setter上修补了这两个函数,现在我在这两个方面都进行了昂贵的计算。我想避免这种情况。无法知道网站是否使用了基于承诺的版本或回调版本,因为当网站调用基于承诺的版本时,已完成的setter是空的 所讨论的本机函数在过去没有基于承诺的版本 我不能使用静态分析,因为我正在修补网站使用的本机函数(其代码不在我的控制之下) //2009 //该职能在2009年无效 //今天,它可以回报一个有价值的承

用例:这允许区分用户使用的是基于承诺的样式还是回调样式,因此我可以避免重复计算。我用ES6代理在已完成的setter上修补了这两个函数,现在我在这两个方面都进行了昂贵的计算。我想避免这种情况。无法知道网站是否使用了基于承诺的版本或回调版本,因为当网站调用基于承诺的版本时,已完成的setter是空的

所讨论的本机函数在过去没有基于承诺的版本

我不能使用静态分析,因为我正在修补网站使用的本机函数(其代码不在我的控制之下)

//2009
//该职能在2009年无效
//今天,它可以回报一个有价值的承诺,但网站仍然可以使用
//“NativeFoooOnCompleted”以获取结果
nativeFooStart();
NativeFoonCompleted=函数(){};
//今天
//“nativeFooStart”仍然是必需的,并且没有完成
//事件不会发生
让结果=等待nativeFooStart();
//或
nativeFooStart();

NativeFoonCompleted=函数(){}Tl;dr安排微任务

要点是使用wait将函数的其余部分作为一个微任务进行调度

请注意,此答案不会以任何方式尝试检测值是否已被丢弃。这仅仅是为了回答第一段(用例),不再需要静态代码分析和运行时源代码解析

其目的只是将控制权让给调用例程

wait nonPromiseValue
wait Promise.resolve(nonPromiseValue)
相同。它“立即”完成,但仍将代码安排在等待表达式之后,以便稍后运行。因此,使用
f=async()=>{await 1;2;}
并调用
f();g()

从哪个值到它改变了什么,或者它是否真的改变了什么,都没有区别

let onCompleted;//这可能是某个请求对象的属性,但演示不需要它
函数takeHoursToCompute(){console.log('computing');返回'Done';}
函数takeMinutesToProcess(){console.log('processing');}
异步函数f(){
//我们想看看调用方是否设置为onComplete。问题是,它只在调用f()之后发生。
//然而,如果我们等待它(即使这不是一个承诺),这将让调用函数在继续之前完成。
//注意,*此时*await(onCompleted)将给出未定义的,但是。。。
等待完成;
//…但是*到现在为止*onCompleted已经是调用方设置的。
const result=takeHoursToCompute();
如果(未完成的类型=='function'){
//非承诺电话
takeMinutesToProcess();
未完成(结果);
}否则
log(“跳过处理”);
返回结果;//返回承诺(因为异步)
}
addEventListener('DOMContentLoaded',()=>{//调用代码
/*不要同时调用这两个分支,因为我不清除任何地方的onComplete,这会破坏目的*/
如果(真){
//回调样式
f();
onCompleted=result=>document.getElementById('result')。textContent=result;
}否则{
//异步样式
(异步()=>{
document.getElementById('result').textContent=await f();
})();
}
});
结果:


看到控制台了吗注释不用于扩展讨论;这段对话已经结束。