JavaScript - 等待/阻塞,直到构造函数完全加载

Blu*_*s23 2 javascript asynchronous synchronous

我正在创建的JavaScript API具有以下结构:

var engine = new Engine({
    engineName: "TestEngine",
    engineHost: "localhost"
});

// I don't want to proceed to the next line until Engine is fully loaded
// But the following part of the API is immediately called before the above is loaded
engine.startCar(
    "car_name",
    "car_id"
);
Run Code Online (Sandbox Code Playgroud)

"引擎"实例需要几秒钟才能加载(1-2秒).所以在那之前, engine.startCar不应该被召唤.

如何对构造函数(new Engine())进行内部更改,使其在完全加载之前不返回实例?

mac*_*ost 7

这是JavaScript中的标准问题.通常,当您发出AJAX请求时会发生这种情况,但基于超时的延迟具有相同的基本问题.

jQuery和大多数具有此类问题的库通过使用初始方法来解决此问题,该方法返回"延迟"或"承诺"对象,可用于说"当X完成时,执行Y".

最好用例子来解释.如果在Engine构造函数中执行以下操作:

function Engine(option) {
     var readyDeferred = new $.Deferred();
     this.ready = readyDeferred;
     window.setTimeout(1000, function() {
         readyDeferred.resolve();
     }
}
Run Code Online (Sandbox Code Playgroud)

您在构建引擎时可以执行以下操作:

var engine = new Engine({...});
engine.ready.done(function() {
    // start your engines!
});
Run Code Online (Sandbox Code Playgroud)

当然,由于客户端计算机的时间不同,如果您可以使用除a之外的某些逻辑window.setTimeout来触发您的计算机,那就更好了readyDeferred.resolve();.例如,您可以在所有AJAX请求完成时触发它,这比任何特定的等待时间都更可预测.