如何包装有时会执行异步调用的函数调用以使其同步运行

时间:2016-11-09 12:06:21

标签: javascript jquery ajax asynchronous

我有一个逻辑是:

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

GetDataChunk有时会在内部进行AJAX调用,有时则不会。如何包装_getDtaChunk函数以强制它一直同步操作?

2 个答案:

答案 0 :(得分:1)

不要 - 让代码行事,因为它始终是异步的。

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

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的前五张幻灯片,其中显示了如何缓存异步计算结果

答案 1 :(得分:-1)

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

您需要将功能更改为以下内容:

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

当您致电self._getDataChunk时,请在通话中添加true

self._getDataChunk(action, true)