$ .ajax成功函数等待

时间:2015-07-21 10:18:45

标签: javascript jquery ajax

由于$.ajax GET的{​​我认为'的性质,我不确定我在寻找什么是可能的,但我想我应该问,因为它给我带来了一些麻烦。我绝不是JS的专家,如果这很明显,标题很差,不能想出一个不同的方式来道歉。

我在做什么 - 使用$.ajax从后端API函数中获取值(这些工作)。在success属性中,我使用匿名函数传递更多数据,否则将无法返回。当单步执行Chrome控制台中的控制台断点时,通常会跳过成功功能,因为它的恢复速度不够快。

我想要什么 - 在下面的示例中,我不希望getStuff在成功DoSomething返回之前完成,因为我缺少加载我需要传递给DoSomething的API数据 - 这可能实现吗?

示例

function getStuff(id, hid) {
    $.ajax({
        type: "GET",
        url: "/api/GetMyStuff/" + id,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (vData) {
            DoSomething(vData, id, hid); // not always being hit
        }
    });
}

2 个答案:

答案 0 :(得分:2)

您可以使用async选项并将其设置为false以获得同步通话:

function getStuff(id, hid) {
    $.ajax({
        type: "GET",
        url: "/api/GetMyStuff/" + id,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false, // HERE
        success: function (vData) {
            DoSomething(vData, id, hid); // not always being hit
        }
    });
}

这不是执行ajax请求的好方法,您应该重新考虑您的代码组织(例如为您的getStuff方法提供回调函数并在{{1}中调用它回调)。

答案 1 :(得分:1)

你要做的事是不可能的。异步性是“漏洞”,这意味着任何需要回调的异步操作(例如$.ajax())都必然会强制异步控制流一直到调用链。

请注意,在不久的将来(感谢ES7中的async/await),这种情况会好一些。异步性仍然是漏洞,但新的关键字使得重构场景比在任何地方手动干扰回调更容易。