我有一个js函数,在做了一些业务逻辑之后,javascript函数应该将一些结果返回给另一个变量。下面的示例代码
var response="";
function doSomething() {
$.ajax({
url:'action.php',
type: "POST",
data: dataString,
success: function (txtBack) {
if(txtBack==1) {
status=1;
}
});
return status;
}
我想在这里使用
response=doSomething();
我想指定一个返回值“status”“var response”。但结果是'undefined'。
答案 0 :(得分:54)
或者只是......
var response = (function() {
var a;
// calculate a
return a;
})();
在这种情况下,响应变量接收函数的返回值。该函数立即执行。
如果要使用需要计算的值填充变量,则可以使用此构造。请注意,所有计算都在匿名函数内部进行,因此您不会污染全局命名空间。
答案 1 :(得分:16)
AJAX请求是异步的。您的doSomething函数正在被执行,正在进行AJAX请求,但它是异步发生的;所以doSomething的剩余部分被执行,并且返回时status
的值是未定义的。
实际上,您的代码的工作方式如下:
function doSomething(someargums) {
return status;
}
var response = doSomething();
然后一段时间后,你的AJAX请求正在完成;但现在已经太晚了
您需要更改代码,并在AJAX请求的“成功”回调中填充“响应”变量。在AJAX调用完成之前,您将不得不延迟使用响应。
您之前可能有过的地方
var response = doSomething();
alert(response);
你应该这样做:
function doSomething() {
$.ajax({
url:'action.php',
type: "POST",
data: dataString,
success: function (txtBack) {
alert(txtBack);
})
});
};
答案 2 :(得分:6)
您只需从函数中返回一个值:
var response = 0;
function doSomething() {
// some code
return 10;
}
response = doSomething();
答案 3 :(得分:1)
在上下文中检索正确值的唯一方法是同步运行$.ajax()
函数(实际上与主AJAX思想相矛盾)。您应将特殊配置属性async
设置为false
。在这种情况下,实际包含$.ajax()
函数调用的主范围将暂停,直到同步函数完成为止,因此return
仅在$.ajax()
之后调用。
function doSomething() {
var status = 0;
$.ajax({
url: 'action.php',
type: 'POST',
data: dataString,
async: false,
success: function (txtBack) {
if (txtBack == 1)
status = 1;
}
});
return status;
}
var response = doSomething();
答案 4 :(得分:0)
由于HandlerThread
运行异步操作,因此结果为undefined
。这意味着$.ajax
在return status
操作完成请求之前被执行。
您可以使用Promise来获得同步的语法。
$.ajax
您可以这样称呼诺言
function doSomething() {
return new Promise((resolve, reject) => {
$.ajax({
url:'action.php',
type: "POST",
data: dataString,
success: function (txtBack) {
if(txtBack==1) {
resolve(1);
} else {
resolve(0);
}
},
error: function (jqXHR, textStatus, errorThrown) {
reject(textStatus);
}
});
});
}
或这个
doSomething.then(function (result) {
console.log(result);
}).catch(function (error) {
console.error(error);
});