如何包装函数调用,有时做异步调用,使其行为同步



我有一个函数,逻辑是:

    _setDataChunk: function (action) {
        var self = this;
        /* some code */
        var data = self._getDataChunk(action);
        populateWidget(data);
    }

GetDataChunk有时内部有AJAX调用,有时没有。如何包装_getDtaChunk函数,以迫使它始终同步行动?

不要让你的代码总是异步的。

假设(例如)您不想读取的原因是因为您已经拥有数据:

function _getDataChunk(params) {
     if (!cachedPromise) {
         cachedPromise = $.ajax(...);
     }
     return cachedPromise;
}

,然后使用Promise:

_setDataChunk: function (action) {
    this._getDataChunk(action).then(populateWidget);
}

参见http://www.slideshare.net/RayBellis/memoizing-withindexeddb的前五张幻灯片,其中展示了如何缓存异步计算的结果

可以强制_getDataChunk中的ajax请求以同步模式运行。

您需要将函数更改为如下内容:

function _getDataChunk(action, forceSync) {
    var forceSync = (typeof forceSync !== 'undefined') ?  forceSync : false;
    ...
    $.ajax({
        ...
        async: !forceSync,
        ...
    });
}

当您调用self._getDataChunk时,将true添加到呼叫中:

self._getDataChunk(action, true)

最新更新