首页 > 解决方案 > 我在使用 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。

我得到的提示:

  1. fooBetter并且gooBetter彼此独立。
  2. 节点 js 文档部分的链接。

根据我从面试官那里得到的感受,答案应该包括与 async/sync/timings 如何在 js 中深入工作有关的内容,以及由于 fooBetter 和 gooBetter 是独立的,我们可能不会 fooBetter 并且只有当我得到答案时使用 gooBetter。

标签: javascriptnode.js

解决方案


我认为面试官想要听到的是,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,这个问题会更简单。


推荐阅读