Подтвердить что ты не робот

Присвойте значение функции функции некоторой переменной с помощью javascript

У меня есть функция js, после выполнения некоторой бизнес-логики функция javascript должна возвращать некоторый результат в другую переменную. Пример кода ниже

var response="";
function doSomething() {  
    $.ajax({
        url:'action.php',
        type: "POST",
        data: dataString,
        success: function (txtBack) { 
            if(txtBack==1) {
                status=1;
            }
    });
    return status;     
}

Здесь я хочу использовать как

response=doSomething();

Я хочу присвоить возвращаемое значение "status" "var response". Но результат "undefined".

4b9b3361

Ответ 1

Или просто...

var response = (function() {
    var a;
    // calculate a
    return a;
})();  

В этом случае переменная ответа получает возвращаемое значение функции. Функция выполняется немедленно.

Вы можете использовать эту конструкцию, если хотите заполнить переменную значением, которое необходимо вычислить. Обратите внимание, что все вычисления происходят внутри анонимной функции, поэтому вы не загрязняете глобальное пространство имен.

Ответ 2

Запросы AJAX являются асинхронными. Функция doSomething вызывается, запрос AJAX выполняется, но происходит асинхронно; поэтому выполняется остаток doSomething, а значение status - undefined, когда оно возвращается.

Эффективно, ваш код работает следующим образом:

function doSomething(someargums) {
     return status;
}

var response = doSomething();

И через некоторое время ваш запрос AJAX завершается; но уже слишком поздно

Вам нужно изменить свой код и заполнить переменную "ответ" в обратном вызове "success" вашего запроса AJAX. Вам придется откладывать использование ответа до завершения вызова AJAX.

Если раньше вы имели

var response = doSomething();

alert(response);

Вам следует:

function doSomething() {  
    $.ajax({
           url:'action.php',
           type: "POST",
           data: dataString,
           success: function (txtBack) { 
            alert(txtBack);
           })
    }); 
};

Ответ 3

Вы можете просто вернуть значение из функции:

var response = 0;

function doSomething() {
    // some code
    return 10;
}
response = doSomething();

Ответ 4

Единственный способ получить правильное значение в вашем контексте - запустить функцию $.ajax() синхронно (что фактически противоречит основной идее AJAX). Существует специальный атрибут конфигурации async, который вы должны установить в false. В этом случае основная область действия, которая фактически содержит вызов функции $.ajax(), приостанавливается до тех пор, пока не будет выполнена синхронная функция, поэтому return вызывается только после $.ajax().

function doSomething() {
    var status = 0;
    $.ajax({
        url: 'action.php',
        type: 'POST',
        data: dataString,
        async: false,
        success: function (txtBack) {
            if (txtBack == 1)
                status = 1;
        }
    });

    return status;
}

var response = doSomething();

Ответ 5

В результате получается undefined, поскольку $.ajax выполняет асинхронную операцию. Это означает, что return status выполняется до того, как операция $.ajax завершится с запросом.

Вы можете использовать Promise, чтобы иметь синтаксис, который кажется синхронным.

function doSomething() { 
    return new Promise((resolve, reject) => {
        $.ajax({
            url:'action.php',
            type: "POST",
            data: dataString,
            success: function (txtBack) { 
                if(txtBack==1) {
                    resolve(1);
                } else {
                    resolve(0);
                }
            },
            error: function (jqXHR, textStatus, errorThrown) {
                reject(textStatus);
            }
        });
    });
}

Вы можете назвать обещание следующим образом

doSomething.then(function (result) {
    console.log(result);
}).catch(function (error) {
    console.error(error);
});

или это

(async () => {
    try {
        let result = await doSomething();
        console.log(result);
    } catch (error) {
        console.error(error);
    }
})();