Javascript:调用阻塞的 HTTP POST [重复]

Posted

技术标签:

【中文标题】Javascript:调用阻塞的 HTTP POST [重复]【英文标题】:Javascript: call a blocking HTTP POST [duplicate] 【发布时间】:2017-09-16 18:44:41 【问题描述】:

我有一个调用函数,它调用另一个发送带有参数的 HTTP POST 的函数。现在我希望这个被调用的函数阻止执行,直到它“成功”(所以当它的 HTTP POST 完成时)。

这是我的逻辑代码:

var fingerprint = null;
var janus_session = null;
var inserted = "false";

$(document).ready(function() 
      //stuff
      fingerprint = FindFingerprint(jsep);

      janus_session = janus.getSessionId();
      inserted = SendSDPLine(fingerprint, janus_session);
      console.log("**in MAIN: inserted= " + inserted);

      //other stuff
    

function SendSDPLine(fingerprint, janus_session) 
  var sdp = fingerprint;
  //    var url = "http://localhost:8484/Shine/AccountController";
  var action_type = "InsertSDPLine";
  var sessionid = janus_session;

  $.ajax(
    type: "POST",
    url: url,
    xhrFields: 
      withCredentials: false
    ,
    data: 
      "action": action_type,
      "sdpline": fingerprint,
      "sessionid": sessionid
    ,
    success: function(data) 
      if (data == "INSERTED") 
        inserted = "true";
        console.log("in SENDSDPLINE: inserted= " + inserted);
      
      return inserted;
      //        return checkFingerprint (fingerprint);
    ,
    // vvv---- This is the new bit
    error: function(jqXHR, textStatus, errorThrown) 
      console.log("Error, status = " + textStatus + ", " +
                  "error thrown: " + errorThrown);
    
  );


简而言之,我希望在检查 HTTP POST 响应之后执行 other stuff。我已经看到了另一个问题:最初,inserted 具有 false 值。在 HTTP POST 响应中的成功(数据)中,它具有 true 值。但是,在调用者函数中,以下console.log 具有undefined 值。

所以,我有两个问题:

    如何将此值返回给调用者函数 如何在收到 HTTP POST 响应之前停止调用函数的执行?

【问题讨论】:

也许 async/await 可以在这里为您提供帮助。但如果不是,那么就不可能(停止调用函数的执行),你必须求助于使用承诺或回调。 【参考方案1】:

如果您需要阻止执行直到 AJAX 返回,您可以在 ajax 参数中指定 async:false,如 jQuery documentation。

【讨论】:

【参考方案2】:

使用回调函数

var fingerprint = null;
var janus_session = null;
var inserted = "false";


$(document).ready(function() 

//stuff

fingerprint = FindFingerprint(jsep); 


janus_session = janus.getSessionId();

//Use callback funcion to access 
SendSDPLine(fingerprint,janus_session , function(error,inserted)

  if(error)
     console.log("**Error in : "+error);
  

  console.log("**in MAIN: inserted= "+inserted);


);


//other stuff



function SendSDPLine(fingerprint,janus_session, callback)

  var sdp=fingerprint;
//    var url = "http://localhost:8484/Shine/AccountController";
var action_type = "InsertSDPLine";
var sessionid = janus_session;

$.ajax(
  type:    "POST",
  url:     url,
  async: false, 
  xhrFields: 
    withCredentials: false
  ,
  data:
    "action"      : action_type,
    "sdpline"     : fingerprint,
    "sessionid"   : sessionid
  ,
  success: function(data) 
    if (data == "INSERTED") 
      inserted = "true";
      console.log("in SENDSDPLINE: inserted= "+inserted);

      //return result
      return callback(null, inserted);
    



      //        return checkFingerprint (fingerprint);

    ,
    // vvv---- This is the new bit
    error:   function(jqXHR, textStatus, errorThrown) 
      console.log("Error, status = " + textStatus + ", " +
        "error thrown: " + errorThrown
        );

      //return error
      return callback(errorThrown, null);
    
  );


【讨论】:

以上是关于Javascript:调用阻塞的 HTTP POST [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何制作非阻塞的javascript代码?

如何制作非阻塞的javascript代码?

Akka HTTP:将来阻塞会阻塞服务器

Java中使用HTTP阻塞式调用服务器API

Spring 3 + JSON 的问题:HTTP 状态 406?

?浏览器特性