Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.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
Javascript 同步函数调用涉及post-json调用,其中一个函数在另一个函数成功后应该成功_Javascript_Jquery_Json_Post - Fatal编程技术网

Javascript 同步函数调用涉及post-json调用,其中一个函数在另一个函数成功后应该成功

Javascript 同步函数调用涉及post-json调用,其中一个函数在另一个函数成功后应该成功,javascript,jquery,json,post,Javascript,Jquery,Json,Post,我有两个函数,其中一个函数包含多个json调用,它们本质上是post 我希望这些是同步的。也就是说,应该只在前一个帖子完成后运行(如果所有帖子都完成并且成功,我希望启动第二个函数) 代码结构有点像这样: $.getSomeData = function() { $.postJSON("iwantdata.htm",{data:data},function(data)){ }); $.postJSON("iwantmoredata.htm",{data:data}

我有两个函数,其中一个函数包含多个json调用,它们本质上是post

我希望这些是同步的。也就是说,应该只在前一个帖子完成后运行(如果所有帖子都完成并且成功,我希望启动第二个函数)

代码结构有点像这样:

    $.getSomeData = function() {
    $.postJSON("iwantdata.htm",{data:data},function(data)){
    });

    $.postJSON("iwantmoredata.htm",{data:data},function(data)){
    });
    });

    $.useSomeData = function() {
});
function chainPost(url1, url2, initialInput, func) {
    $.post(url1, {data: initialInput})
        .done(function (initialOutput) {
            $.post(url2, {data: initialOutput})
                .done(function (secondOutput) {
                    func(initialOutput, secondOutput);
                });
        });
}

chainPost("iwantdata.htm", "iwantmoredata.htm", 0, function (first, second) {
    alert(first);
    alert(second);
});
$.getSomeData = function(fn) {
   $.postJSON("iwantdata.htm",{data:data},function(data) {
       $.postJSON("iwantmoredata.htm",{data:data},function(data)){
           fn(data);
       });
   });
};
useSomeData
必须在后续json调用中起作用


有人能帮我吗?提前谢谢

所以基本上你想要这样的东西:

    $.getSomeData = function() {
    $.postJSON("iwantdata.htm",{data:data},function(data)){
    });

    $.postJSON("iwantmoredata.htm",{data:data},function(data)){
    });
    });

    $.useSomeData = function() {
});
function chainPost(url1, url2, initialInput, func) {
    $.post(url1, {data: initialInput})
        .done(function (initialOutput) {
            $.post(url2, {data: initialOutput})
                .done(function (secondOutput) {
                    func(initialOutput, secondOutput);
                });
        });
}

chainPost("iwantdata.htm", "iwantmoredata.htm", 0, function (first, second) {
    alert(first);
    alert(second);
});
$.getSomeData = function(fn) {
   $.postJSON("iwantdata.htm",{data:data},function(data) {
       $.postJSON("iwantmoredata.htm",{data:data},function(data)){
           fn(data);
       });
   });
};

您可以只嵌套它们,从第一个的完成函数中的第二个开始,依此类推:

$.getSomeData = function() {
   $.postJSON("iwantdata.htm",{data:data},function(data) {
       $.postJSON("iwantmoredata.htm",{data:data},function(data)){
           // use the data here
       });
   });
};
处理非同步函数时,不能编写以下代码:

$.getSomeData();
$.useSomeData();
根据定义,第一个函数是异步的,因此在调用第二个函数时它还没有完成,javascript在异步操作完成之前无法停止JS执行

您可以将use函数传递给get函数,然后在数据作为上述示例的补充可用时调用它,如下所示:

    $.getSomeData = function() {
    $.postJSON("iwantdata.htm",{data:data},function(data)){
    });

    $.postJSON("iwantmoredata.htm",{data:data},function(data)){
    });
    });

    $.useSomeData = function() {
});
function chainPost(url1, url2, initialInput, func) {
    $.post(url1, {data: initialInput})
        .done(function (initialOutput) {
            $.post(url2, {data: initialOutput})
                .done(function (secondOutput) {
                    func(initialOutput, secondOutput);
                });
        });
}

chainPost("iwantdata.htm", "iwantmoredata.htm", 0, function (first, second) {
    alert(first);
    alert(second);
});
$.getSomeData = function(fn) {
   $.postJSON("iwantdata.htm",{data:data},function(data) {
       $.postJSON("iwantmoredata.htm",{data:data},function(data)){
           fn(data);
       });
   });
};
然后,您将拥有一个
getSomeData(useFn)
函数,该函数将在所有数据就绪时调用函数的一个参数。

非常适合于此。不幸的是,您的代码示例包含语法错误,并且不清楚调用是如何嵌套的。所以,我不确定您是想一个接一个地运行这两个Ajax调用,还是并行运行,但这两种方法都是可能的

这里有两个例子。有关更多信息,请查看文档,并尝试使用它

注意:
.postJSON
不是内置的jQuery方法,我假设您正在从
$.ajax
(或
$.post
)函数返回返回值

并行Ajax调用:

$.getSomeData = function() {
    var a = $.postJSON("iwantdata.htm", {data:data});
    var b = $.postJSON("iwantmoredata.htm", {data:data});

    // return a new promise object which gets resolved when both calls are
    // successful
    return $.when(a, b);
};

// when both calls are successful, call `$.useSomeData`
// it will have access to the responses of both Ajax calls
$.getSomeData.done($.useSomeData);
见:

链接的Ajax调用:

$.getSomeData = function() {
    var a = $.postJSON("iwantdata.htm", {data:data});
    var b = $.postJSON("iwantmoredata.htm", {data:data});

    // return a new promise object which gets resolved when both calls are
    // successful
    return $.when(a, b);
};

// when both calls are successful, call `$.useSomeData`
// it will have access to the responses of both Ajax calls
$.getSomeData.done($.useSomeData);
。。。其中,第一个调用的响应是第二个调用的输入。这只是一个例子,当然你可以传递任何你想要的数据

$.getSomeData = function() {
    return $.postJSON("iwantdata.htm", {data:data}).pipe(function(response) {
        // execute the second Ajax call upon successful completion 
        // of the first one
        return $.postJSON("iwantmoredata.htm", {data:response});
    });
};

// if both Ajax calls are successful, call `$.useSomeData`
// it will have access to the response of the second Ajax call
$.getSomeData.done($.useSomeData);
见:


如果您有更复杂的逻辑,您还可以创建、解析或拒绝自己的延迟对象。请查看文档中的示例。

我建议编辑您的答案和标题,以删除出现的“同步”一词。这不是JSON中“同步”的含义(如果XML HTTP请求等待服务器继续处理客户端代码,则该请求是同步的,这通常是一件坏事)。你是在寻找“原子”这个词,意思是它们要么都成功,要么都失败?或者你想把这些链接起来,这样一旦你得到第一个输出,你就会要求更多的输出。。。但是要注意的是,如果一件事情失败,链将停止处理?请注意,链接示例使用第一个调用的结果作为第二个调用的参数call@Bergi:是的,这样做似乎最有意义。。。这只是一个例子。这是真的-链接它们的唯一原因是#2需要来自#1:-)@Bergi的数据-使用返回的数据不是链接的唯一原因#2可能只是序列中的第二个操作,需要等待1是否成功,但不需要1的结果。还有一个后端原因是必须对操作进行排序。