Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 返回变量和ajax请求_Jquery - Fatal编程技术网

Jquery 返回变量和ajax请求

Jquery 返回变量和ajax请求,jquery,Jquery,我试图获取一个变量,但它返回未定义。也许我在范围或时间上有问题 var pid = getPart(upc); console.log('pid: '+pid); addPart(pid); getPart()没有返回值,但post正在工作并获取id。我无法记录pid或在addPart()中使用它,因为它似乎没有返回 function getPart(upc){ $.post('include/_getpart.php', {upc: upc}, function(data){

我试图获取一个变量,但它返回未定义。也许我在范围或时间上有问题

var pid = getPart(upc);
console.log('pid: '+pid);

addPart(pid);
getPart()没有返回值,但post正在工作并获取id。我无法记录pid或在addPart()中使用它,因为它似乎没有返回

function getPart(upc){
    $.post('include/_getpart.php', {upc: upc}, function(data){
        name = data.name;
        id = data.id;

        return id;
    }, "json");
}
为了完整,我将发布我的整个脚本

<script language="javascript">
var success = 0;
var addedArray = [];

function add(form) {
    console.log('form for '+form.name);
    $(':input[type="number"]', form).each(function() {
        if (this.value > 0){
            upc = this.name;
            qty = this.value;
            console.log(upc + ': ' + qty);

            var pid = getPart(upc);
            console.log('pid: '+pid);

            //addPart(pid);
        }
    });
    if (success==1) {
        console.log(addedArray);
    }
}

function getPart(upc){
    $.post('include/_getpart.php', {upc: upc}, function(data){
        name = data.name;
        id = data.id;
        /*
        console.log('name: '+name);
        console.log('product id: '+pid);

        var productArray = new Array(name, qty);
        console.log(productArray);
        addedArray.push(productArray);
        */
        return id;
    }, "json");
}

function addPart(pid){
    if (!pid) {
        console.log('error: product id (pid) was not found');
        return;

    } else {
        $.post('include/_addpart.php', {pid: pid, qty: qty}, function(data) {
            console.log('_addpart.php response: '+data);
        });
    }
}

</script>

var成功率=0;
var addedArray=[];
函数添加(表格){
console.log('form for'+form.name);
$(':input[type=“number”],form).each(function(){
如果(此值>0){
upc=this.name;
数量=此值;
控制台日志(upc+':'+数量);
var pid=getPart(upc);
log('pid:'+pid);
//添加部分(pid);
}
});
如果(成功==1){
控制台日志(addedArray);
}
}
函数getPart(upc){
$.post('include/_getpart.php',{upc:upc},函数(数据){
name=data.name;
id=data.id;
/*
console.log('name:'+name);
console.log('productid:'+pid);
var productArray=新数组(名称、数量);
log(productArray);
addedArray.push(productArray);
*/
返回id;
}“json”);
}
函数addPart(pid){
如果(!pid){
log('错误:找不到产品id(pid');
返回;
}否则{
$.post('include/_addpart.php',{pid:pid,qty:qty},函数(数据){
log('_addpart.php响应:'+数据);
});
}
}

所有ajax请求都可以工作,我想知道在与服务器通信时可能出现的延迟是否保证跳过所述变量的设置。如果是这样的话,我应该在那里设置一个超时,以及如何设置。

这是由AJAX的异步特性以及无法从回调返回
造成的。事件顺序如下:

  • 您可以使用AJAX调用请求部件(
    getPart()
  • 在AJAX调用(
    post
    )中,您提供了一个匿名函数,在AJAX调用完成时应该调用该函数
  • 因为它是一个异步调用,所以JS继续执行,即JS继续执行
    getPart
    调用后的行,即
    console.log('pid:'+pid)
  • JS将输出
    pid:undefined
    ,因为var
    pid
    已经声明,但在前面的行中没有定义
  • JS将继续执行下一步操作,直到AJAX调用返回响应
  • 当响应返回时,它将执行前面的匿名函数
  • 在该函数的末尾,它看到
    返回id,但是,已经没有任何东西等待此返回了
您必须执行以下操作:

function add(form) {
    console.log('form for '+form.name);
    $(':input[type="number"]', form).each(function() {
        if (this.value > 0){
            ...
            getPart(upc, function(pid){
                // THIS ANONYMOUS FUNCTION WILL BE EXECUTED ONCE THE AJAX CALL RETURNS
                console.log('pid: '+pid);
                //addPart(pid);
            });    
        }
    });
    ...
}

function getPart(upc, callback){
    $.post('include/_getpart.php', {upc: upc}, function(data){
        name = data.name;
        id = data.id;
        // CALLBACK IS THE ANONYMOUS FUNCTION YOU DECLARED ABOVE
        callback(id);
    }, "json");
}
编辑:

如果您只想调用
addPart
(而不想调用
console.log
),则不需要匿名函数。。。然后你可以这样做:

function add(form) {
    console.log('form for '+form.name);
    $(':input[type="number"]', form).each(function() {
        if (this.value > 0){
            ...
            getPart(upc, addPart);    
        }
    });
    ...
}

function getPart(upc, callback){
    $.post('include/_getpart.php', {upc: upc}, function(data){
        name = data.name;
        id = data.id;
        callback(id);
    }, "json");
}
可能的重复可能的重复