promise を返す非同期関数が多数ある既存のプロジェクトがあります。場合によっては非同期関数が同期的に完了し、可能であればこのコードをより短く/より良くしたいと思うように、いくつかのキャッシュを追加しています:
return $.Deferred(function(def) { def.resolve(); }).promise();
たとえば、次のようなほとんどの AJAX 要求を処理する Data Service クラスがあります。
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 を呼び出すのではなく、代わりにいくつかの同期作業を行ってから戻るようにしたいと考えています。ただし、呼び出されたものは何でもそれを期待しているため、プロミスを返す必要がありますが、「すでに完了/解決されたプロミス」である必要があります。現在、上記のコードの最初のセットを使用してそれを行っています。もっと良い方法があるに違いないようです。