如何对服务器进行 JavaScript 同步调用? [复制]

Posted

技术标签:

【中文标题】如何对服务器进行 JavaScript 同步调用? [复制]【英文标题】:How can I make a JavaScript synchronous call to the server? [duplicate] 【发布时间】:2012-12-22 11:43:41 【问题描述】:

可能重复:How can I get jQuery to perform a synchronous, rather than asynchronous, AJAX request?

我有一个返回初始化数据的方法。它首先检查 sessionStorage。如果它在那里没有找到数据,它会调用服务器来获取数据。代码如下:

function getInitializationData() 

// Check local storage (cache) prior to making a server call.
// Assume html 5 browser because this is an Intranet application.
if (!sessionStorage.getItem("initialData")) 

    // The browser doesn't have the initialization data,
    // so the client will call the server to get the data.
    // Note: the initialization data is complex but 
    // HTML 5 storage only stores strings. Thus, the
    // code has to convert into a string prior to storage.
    $.ajax(
        url: "../initialization.x",
        type: "POST",
        dataType: "json",
        timeout: 10000,
        error: handleError,
        success: function(data)  sessionStorage.setItem("initialData", JSON.stringify(data));  
    );


// convert the string back to a complex object
return JSON.parse(sessionStorage.getItem("initialData"));

问题是成功函数几乎总是在方法返回后执行。如何使服务器调用同步,使得成功函数必须在 getInitializationData 方法的返回语句之前执行?

【问题讨论】:

这个问题每天都会被问到......你可以让它同步,但这通常是个坏主意。让getInitializationData 接受回调或查看延迟对象 (api.jquery.com/category/deferred-object)。现在要写一个规范的问题/答案,因为在某些时候它就足够了...... 你读过 jQuery API 吗? async:false 呢? api.jquery.com/jQuery.ajax -- 谷歌搜索“jquery ajax synchronized”的第一个结果 具有讽刺意味的是,OP 在编写初始问题时必须绕过的问题数量,并且公然无视右侧的列表。 ;p 您可以在$.ajax 调用中将async: false 添加到您的选项中,这样就可以解决问题。然而,该属性已被弃用,并且可能在未来的版本中不受支持。 【参考方案1】:

使用async: false

function getInitializationData() 

// Check local storage (cache) prior to making a server call.
// Assume HTML 5 browser because this is an Intranet application.
if (!sessionStorage.getItem("initialData")) 

    // The browser doesn't have the initialization data,
    // so the client will call the server to get the data.
    // Note: the initialization data is complex but 
    // HTML 5 storage only stores strings. Thus, the
    // code has to convert into a string prior to storage.
    $.ajax(
        url: "../initialization.x",
        type: "POST",
        dataType: "json",
        timeout: 10000,
        async: false,
        error: handleError,
        success: function(data)  sessionStorage.setItem("initialData", JSON.stringify(data));  
    );


// convert the string back to a complex object
return JSON.parse(sessionStorage.getItem("initialData"));

【讨论】:

@Dirty-flow 哦,拜托……不是每个人都知道。老兄要总分! @Dirty-flow:每天都有大量问题被关闭,每天都会问这些类型的基本问题。这并不意味着当你遇到这样一个问题时你不回答。

以上是关于如何对服务器进行 JavaScript 同步调用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中同步调用一组函数

在javascript中同步进行地理定位调用

对 Web 服务的 jQuery Ajax 调用似乎是同步的

如何使javascript获取同步? [复制]

如何在同步模式下调用javascript函数

如何在 C#/XAML Metro App 中使用 HttpWebRequest(或)HttpClient 进行同步服务调用?