У меня есть существующий проект с множеством асинхронных функций, возвращающих promises. Я добавляю некоторое кэширование, чтобы в некоторых случаях асинхронные функции выполнялись синхронно и хотели бы сделать этот код короче/лучше, если это возможно:
return $.Deferred(function(def) { def.resolve(); }).promise();
Например, у меня есть класс Data Service, который обрабатывает большинство запросов AJAX, которые выглядят следующим образом:
function DataService() {
var self = this;
self.makeRequest = function(functionName, data) {
return $.Deferred(function(def) {
var jsonData = JSON.stringify(data);
$.ajax({
type: "POST",
url: "WebService.asmx/" + functionName,
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function(xhr, status, error) {
var ex;
try {
ex = eval("(" + xhr.responseText + ")");
ex.message = ex.Message;
ex.Message = undefined;
} catch (ex2) {
ex = { message: "Invalid Response From Server:\r\n" + xhr.responseText };
}
if (ex.message == "LoginRequired") {
app.viewModels.main.loginRequired(true);
}
else {
app.showError(ex.message);
}
def.reject(ex.message);
}
});
}).promise();
}
}
Затем у меня есть функция в другом классе, которая в настоящее время всегда вызывает makeRequest:
self.deleteMe = function()
{
return app.dataservice.makeRequest('deleteItem');
}
Я хочу обновить функцию deleteMe, чтобы она не всегда вызывала makeRequest, а вместо этого просто выполняет некоторую синхронную работу и затем возвращает. Он должен вернуть обещание, хотя, поскольку все, что его назвало, будет ожидать этого, но оно должно быть "уже завершенным/разрешенным обещанием". В настоящее время я использую первый набор кода выше, чтобы сделать это. Похоже, что должен быть лучший способ.