我有一个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);
它们将显示为未定义。我该如何捕捉它们?
答案 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
调用何时“完成”并使其结果可用,即使将结果分配给全局也无法按预期工作。您只能对回调中的返回值进行操作。
考虑一下你的计划中的时间:
这说明了Node
中编程的异步性质:程序中的内容发生在 不可预测的 次,因此您无法假设操作的结果将在操作本身的上下文之外 。
要在Node
中进行有效编程,您必须根据多个看似并发操作来考虑您的程序流程,这些操作仅在完成后生成结果并将其传递给提供的回调
答案 3 :(得分:-1)
你应该试试这个
$.ajax({
url: 'script.php?val1=' + value1 + '&val2=' + value2,
dataType: "json",
success: function (data) {
var newValue1 = data.d
}
我不知道你是如何从服务器端发回数据的,但是如果你发送1 var,.d会把它发给你