Когда вы объявляете функцию как async
, она неявно возвращает Promise
, если это явно не сделано.Это означает, что ваша getDetails
функция всегда будет возвращать Promise
.Таким образом, вам нужно либо использовать обратный вызов .then
, чтобы получить результат из getDetails
, либо использовать await
, чтобы «распаковать» результат из обещания.
Еще одна вещь, которую вы можете изменить в своем кодеВам не нужно заключать в запрос ajax
обещание:
Документация по jQuery API :
jqXHRобъекты, возвращаемые $ .ajax () начиная с jQuery 1.5, реализуют интерфейс Promise, предоставляя им все свойства, методы и поведение Promise ...
Это означает, что ваш запрос ajax будет resolve
и reject
для вас, и, таким образом, позволяет обрабатывать возвращаемое значение как Promise
, что позволяет вам установить переменную обещания, прямо равную вашему запросу ajax:
async function getDetails(data) {
let promise = $.ajax({
url: "/get-details",
type: "get",
contentType: "application/json",
data: {
"text": data
}
});
let result = await promise;
console.log(`result: ${result}`);
return result; // returns a new promise with the return value as the resolve
}
async function test() {
let result = await getDetails("query-text"); // await to "unpack" the promise returned via your async function "getDetails"
console.log(`result in test : ${result}`);
}
test();
Но, как @ Terry указал в своем великолепном ответе, что если вы просто используете jQuery для отправки ajax-запроса, то в этом действительно нет необходимости (если вы действительно не беспокоитесь о поддержке браузера).fetch
может сделать работу за вас.