Jquery получает текстовый файл и возвращает значение другой функции

#javascript #jquery

#javascript #jquery

Вопрос:

Может ли кто-нибудь помочь мне, в чем я ошибаюсь

 function separateerror()
{
    var jqxhr = $.get("/errormsg.txt", function(data) {
        line = data;
        array = line.split(',');
        getmsg=array[0];
    })
    return getmsg;
}
  

мне нужно вернуть «getmsg» в другую функцию, но она не работает, где, как будто я добавляю предупреждение между ними

 function separateerror()
{
    var jqxhr = $.get("/errormsg.txt", function(data) {
        line = data;
        array = line.split(',');
        getmsg=array[0];
    })
    //alert(getmsg)
    return getmsg;
}
  

значение возвращает, что неправильно я делаю в коде?

Комментарии:

1. как / где вы вызываете эту функцию separateerror ??

Ответ №1:

$.get это асинхронный вызов, и происходит то, что если вы добавляете промежуточное оповещение, вы даете время для завершения асинхронного вызова, а затем ваше значение уже установлено к моменту завершения separateerror функции. В противном случае separateerror функция возвращается до завершения $.get вызова, и тогда ваше getmsg значение, вероятно, по-прежнему равно нулю.

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

РЕДАКТИРОВАТЬ: кроме того, вы должны обработать $.get обратный вызов ошибки, если что-то произойдет, и вы не сможете загрузить txt файл.

 function separateerror()
 {
    var jqxhr = $.get("/errormsg.txt", function(data) {
       line = data;
       array = line.split(',');
       getmsg=array[0];
       dosomething(getmsg);
    })
    .error(function() { alert("error"); });
}

function dosomething(msg) { ... }
  

Ответ №2:

Вставьте это в начало вашего скрипта. Это / должно / исправить.

 $.ajaxSetup({
  async: false
});
  

Комментарии:

1. Что, если ему нужно больше вызовов ajax — было бы лучше, если бы они были асинхронными.

2. Это будет работать, но это не исправление, поскольку ожидается асинхронное поведение. Это хороший хак, если вам не нужны какие-либо асинхронные вызовы вообще сейчас и в будущем. Если вам когда-нибудь понадобится выполнять асинхронные вызовы в будущем, приготовьтесь к некоторым головным болям

3. Верно. Думаю, именно поэтому у вас больше репутации, чем у меня. Я никогда не думал о том, что произойдет после того, как это было вызвано. Я просто подумал о быстром решении проблемы. Мне есть чему поучиться, спасибо, ребята.