javascript - 我在使用 async/sync/timings 时遇到的 JS 问题
问题描述
收到一个js面试问题,不知道怎么解决,希望大家能帮帮我,所以是这样的:
一家公司制作了这个代码:(注意:goo()
不能返回0,两者都foo
返回goo
数字)
function calculate(x) {
return foo(x) / goo(x, 0);
}
但是后来,他们制作了更好的 API,并且他们将他们的函数移动为异步的,所以他们得到了回调,所以他们实现了相同的功能,但带有回调:
function calculateBetter(x, callback) {
fooBetter(x, (result) => {
gooBetter(x, 0, (result2) => {
callback(result / result2);
});
});
}
问题:如何calculateBetter
优化以尽快完成?
限制:使用纯js,不需要使用workers/promises。
我得到的提示:
fooBetter
并且gooBetter
彼此独立。- 此节点 js 文档部分的链接。
根据我从面试官那里得到的感受,答案应该包括与 async/sync/timings 如何在 js 中深入工作有关的内容,以及由于 fooBetter 和 gooBetter 是独立的,我们可能不会 fooBetter 并且只有当我得到答案时使用 gooBetter。
解决方案
我认为面试官想要听到的是,gooBetter
直到fooBetter
完成才被调用。gooBetter
如果开始甚至没有完成,它会更快fooBetter
。一种可能的解决方案——我不得不承认——不是那么干净,是有一个变量用于确定两个函数是否已经完成。看起来像这样:
function calculateBetter(x, callback) {
let fooResult;
let gooResult;
fooBetter(x, (result) => {
fooResult = result;
if (gooResult) {
callback(fooResult / gooResult);
}
});
gooBetter(x, 0, (result) => {
gooResult = result;
if (fooResult) {
callback(fooResult / gooResult);
}
});
}
如果你可以使用 Promises,这个问题会更简单。
推荐阅读
- recursion - 为什么我不能给 findstr 一个开始的目录?
- javascript - 为什么 ESLint 会警告我认为有用的分号?
- flutter - Flutter Builder 生成有状态的 widgts
- python - 如何从计数结果创建两个单独的列表?
- python - Flask 会话和 Google Oauth
- angular - Prime ng 表在第一次更改时未更新
- python - 检查一个列表的元素是否在另一个子列表的元素中
- r - 找出群体的共同特征,使其与众不同
- swagger - 使用 azure API 管理公开文档
- python - 将 Pytorch 浮点模型转换为双精度