如何捕获AJAX的结果

时间:2017-03-18 19:09:32

标签: javascript jquery ajax

我有一个AJAX请求:

 $.ajax({
     url: 'script.php?val1=' + value1 + '&val2=' + value2,
     dataType: "json",
     success: function (data) {
         var newValue1 = data[0];
         var newValue2 = data[1];
     }
 });

如果我尝试:

console.log(newValue1, newValue2);

它们将显示为未定义。我该如何捕捉它们?

4 个答案:

答案 0 :(得分:2)

AJAX是异步的。您必须在success回调中访问这些值。

$.ajax({
      url: 'script.php?val1='+value1+'&val2='+value2,
      dataType: "json",             
      success: function(data){                             
           var newValue1 = data[0];
           var newValue2 = data[1]; 
           console.log(newValue1, newValue2); // correct
     }
   });

// incorrect
// console.log(newValue1, newValue2); 

答案 1 :(得分:1)

你的变量在success内“死”的原因正如你在评论中所说,是因为你使用var关键字来声明它们,这会在中创建变量< / strong>范围(success回调)。

所以,在你的ajax之外用var声明你的变量,所以范围是全局(全局:假设代码位于最顶层范围内 - 不在模块内部或其他东西) ,并像这样使用它:

var newValue1, newValue2; // sets the scope here

$.ajax({
     url: 'script.php?val1=' + value1 + '&val2=' + value2,
     dataType: "json",
     success: function (data) {
         newValue1 = data[0]; // no var keyword
         newValue2 = data[1]; // their scope is already defined outside of ajax
     }
 });

newValue1和newValue2可以在成功回调中访问,当然也可以在其外部访问,因为它们的范围允许:

console.log(newValue1, newValue2);

小心:在您的代码中,如果您希望阅读成功回调的 这些值,并且您期望已成功设置的值回调,您必须确保成功回调已完成。有很多方法可以做到这一点,但超出了这个答案的范围(没有双关语!)。

参见示例: https://jsfiddle.net/gr5qxk4c/

额外提示:小心变量阴影!

var myvar = "myvar is global!";

function hideTheScope()
{
    var myvar = "nope, since we have the same name here it is a different scope";
    console.log(myvar);
}

console.log(myvar); // "myvar is global!"

hideTheScope(); // "nope, since we have the same name here it is a different scope";

答案 2 :(得分:1)

OP面临的真正问题是对异步编程概念的误解。

Webster将异步定义为'不是同时或并发的',在这种情况下意味着:'不会在可预测的时间段内发生'。

正如我上面所解释的那样,由于您无法知道ajax调用何时“完成”并使其结果可用,即使将结果分配给全局也无法按预期工作。您只能对回调中的返回值进行操作。

考虑一下你的计划中的时间:

  • 00:000通过ajax打电话
  • 00:006尝试访问失败 的结果,因为还没有结果
  • (......时间过去了......)
  • 00:500 ajax call完成并触发回调

这说明了Node中编程的异步性质:程序中的内容发生在 不可预测的 次,因此您无法假设操作的结果将在操作本身的上下文之外

要在Node中进行有效编程,您必须根据多个看似并发操作来考虑您的程序流程,这些操作仅在完成后生成结果并将其传递给提供的回调

答案 3 :(得分:-1)

你应该试试这个

$.ajax({
 url: 'script.php?val1=' + value1 + '&val2=' + value2,
 dataType: "json",
 success: function (data) {
     var newValue1 = data.d

 }

我不知道你是如何从服务器端发回数据的,但是如果你发送1 var,.d会把它发给你