异常是我需要从数据库中立即返回的数据。不过,我需要“连续代码”来等待Id被返回。
最好的办法是不要让这种情况发生,而是要接受事件驱动的,基于浏览器和网络编程的异步性质。
非常小的选项是强制ajax请求同步。目前,在jQuery 1.x中,您可以通过将async: false添加到您的呼叫中来实现此目的;您还必须开始使用自己的$.Deferred而不是从ajax得到的那个,因为从jQuery 1.8开始,使用async: false与jqXHR的内置许诺已被弃用。所以:
self.insertTextItem = function (item, synchronous) { // <== Optional flag
var deferred = $.Deferred(); // <== Your own Deferred
console.log("Insert TextItem with Service");
$.ajax({
type: "POST",
url: serviceRoot + "InsertTextbatchTagItem",
beforeSend: serviceFramework.setModuleHeaders,
data: item,
cache: false,
async: synchronous === true ? false : true, // <=== Use it, ignoring `undefined` and othe rfalsey values
success: function(data) { // Handling you Deferred
deferred.resolveWith(data); // (this is probably incomplete)
}, //
error: function() { //
deferred.reject(); //
} //
});
return deferred.promise(); // Return the promise for your Deferred
};
这将使insertTextItem块(锁定了大多数浏览器的用户界面),直至调用完成。由于jQuery的承诺的工作方式,这也将使done回调同步。 (许多其他承诺实现并非如此,但它是jQuery的。)
该选项使用XMLHttpRequest的基本功能,该功能允许同步ajax。
这个选项也会在jQuery中消失。