我有一个函数,逻辑是:
_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)