如何进行类似于$.ajax()的同步$http()请求?

How to make synchronous $http() requests similar to $.ajax()?

提问人:nordictelecom 提问时间:9/10/2021 最后编辑:nordictelecom 更新时间:9/10/2021 访问量:137

问:

我正在发出同步请求,即我总是设置 .{async: false}

我的问题是,虽然jQuery返回我希望它返回的任何响应数据,但AngularJs返回了一个承诺,这在我看来是一个很大的痛苦。$.ajax()$http()

下面,有一些代码可以演示我的问题。

这是jQuery:

// Library for sending $.ajax requests
Core.libs.prototype.send = function(...) {

    var options = {
        async: false,
        // ...
    };

    return $.ajax(options).done(function(data) {
        return data;
    });

}


// Here I make requests
let rest = Core.libs.rest(...); // Get the library
let myVar = rest.send(...); // Make the request
console.log(myVar);  // This returns an array from DB: [apple, orange] which is OK

这就是 AngularJS:

// Library for sending $http requests
Core.libs.prototype.send = function(...) {

    var options = {
        async: false,
        // ...
    };

    return $http(options).then(function(response) {
        return response.data;
    }, function(err) {
        return err;
    });

}


// Here I make requests
let rest = Core.libs.rest(...); // Get the library
let myVar = rest.send(...); // Make the request
console.log(myVar);  // This returns a PROMISE which is not what I want

有没有办法修改以返回实际数据而不是承诺?Core.libs.prototype.send

我想避免修改库方法以外的任何其他内容。

我不想要这个解决方案,因为那样我就必须在代码中替换它:

let rest = Core.libs.rest(...); // Get the library
let myVar = rest.send(...).then(data => data);  // Make the request
console.log(myVar);  // This returns [apple, orange] but I don't want this solution

我也试过这个,但它没有按预期工作:

// Library for sending $http requests
Core.libs.prototype.send = async function(...) {

    var options = {
        // ...
    };

    let res = await $http(options).then(function(response) {
        return response.data;
    }, function(err) {
        return err;
    });

    return res; 

}


// Here I make requests
let rest = Core.libs.rest(...); // Get the library
let myVar = rest.send(...); // Make the request
console.log(myVar);  // This still returns a PROMISE. Why?
javascript jquery angularjs ajax 请求

评论

1赞 Quentin 9/10/2021
“我正在发出同步请求,即我总是设置 {async: false}。”该功能被弃用是有充分理由的。
0赞 9/10/2021
你需要面对痛苦。你可以用 / 代替回调,这样你基本上可以编写“同步”代码。asyncawait.then()
0赞 nordictelecom 9/10/2021
@Quentin我正在使用 jQuery 1.5
1赞 CBroe 9/10/2021
我认为 Quentin 的评论与任何特定的 jQuery 版本无关。浏览器将在不久的将来开始阻止同步后台请求,您应该已经在浏览器控制台中看到有关此的警告。
0赞 Quentin 9/10/2021
不应该使用jQuery 1.5,因为它不受支持,也没有安全补丁,但正如CBroe所说,这不是我的重点。

答:

0赞 Kevin Le - Khnle 9/10/2021 #1

您应该接受 promise/async await,但这不是问题的重点。为了实现你想要的,你可以使用符号或子句来调用,但不能一起调用:async/awaitthen()

// Library for sending $http requests
Core.libs.prototype.send = async function(...) {

    var options = {
        // ...
    };

    try {
      const response = await $http(options);
      return response.data;
    } catch (err) {
      return err;
    }
}