0

есть некий простой код который должен дергать сервер и брать данные с php скрипта. Но Алерт вызывается черезчур рано -- до того как ответ с сервера прийдет. Как пофиксить?

<script>
    $(document).ready(
        function(){
            var discount = 'noDiscount';
            GetTextFromPage('http://discount.com.net/get_discount.php', discount);

            alert(discount);
        }
    );

    function GetTextFromPage(page, callback) {
        $.ajax({
            type: "GET",
            url: page,
            async:true,
            dataType : 'jsonp',   //you may use jsonp for cross origin request
            crossDomain:true,
            success: function(data, status, xhr) {
                callback(data);
            }
        });
    };
</script>

пытаюсь понять как сделать GetTextFromPage синхронной в то время как внутры был асинхронный вызов.

Фактически, сделать то же что делает await в C#. Вроде:

function(){
    var discount = 'noDiscount';
    AWAIT GetTextFromPage('http://discount.com.net/get_discount.php', discount);
    alert(discount);
}
  • Советы в ответе-дубликате. Там расписаны варианты... Да и собственно если ты написал callback(data); - т.е. понимаешь что в callback надо/можно отдавать результат, то почему его ожидаешь в alert?) – Алексей Шиманский Jun 24 '17 at 08:56
  • ну ты по-сути уже его и написал `GetTextFromPage('http://discount.com.net/get_discount.php', myHandler);

    function GetTextFromPage(str, callback) { /* какие-то действия*/ callback("datasdfsdf");
    }

    function myHandler(data) { console.log(data);
    }` ......... но почитай примеры в вопросе-дубликате

    – Алексей Шиманский Jun 24 '17 at 09:07
  • Используй генераторы из ES6. – Alex78191 Jun 24 '17 at 10:11
  • "Фактически, сделать то же что делает await в C#" ну так и делайте await - он в ES2017 будет введен – Pavel Mayorov Jun 26 '17 at 09:11

1 Answers1

0

Потому что нужно вызывать alert, а вообще alert это плохой тон в использовании, лучше используйте console.log(), в самой функции GetTextFromPage

Вариант №1

    $(document).ready(
        function(){
            GetTextFromPage('http://discount.com.net/get_discount.php', 'noDiscount');
        }
    );

    function GetTextFromPage(page, callback) {
        $.ajax({
            type: "GET",
            url: page,
            async:true,
            dataType : 'jsonp',   //you may use jsonp for cross origin request
            crossDomain:true,
            success: function(data, status, xhr) {
                alert(data);
            }
        });
    };
</script>

Вариант №2

    $(document).ready(
        function(){
            GetTextFromPage('http://discount.com.net/get_discount.php',function(data){alert(data);});
        }
    );

    function GetTextFromPage(page, callback) {
        $.ajax({
            type: "GET",
            url: page,
            async:true,
            dataType : 'jsonp',   //you may use jsonp for cross origin request
            crossDomain:true,
            success: function(data, status, xhr) {
                callback(data);
            }
        });
    };
</script>
Shnur
  • 1,227
  • алерт исключительно для тестирования и не более того, на практике оно будет вставлять текст внутрь хтмл-а. Мне нужно будет использовать даный метод в нескольких местах и нужна универсальная функция для вытягивания данных вместо того что бы плодить дубликаты кода. – Andrew Stop_RU_war_in_UA Jun 24 '17 at 08:56
  • Да исключительно для тестирования и отладки правильно использовать console.log(), я подправил ответ и дописал вам вариант 2 он вам больше подойдет – Shnur Jun 24 '17 at 08:59
  • а может все таки есть способ сделать метод принудительно синхронным? – Andrew Stop_RU_war_in_UA Jun 24 '17 at 09:24
  • В смысле принудительно? – Shnur Jun 24 '17 at 09:32
  • ну вот скажем в шарпе все методы изначально синхронные. И что бы метод стал асинхронным нужно писать async перед обьявой метода. А если нужно подождать пока асинк метод закончит работу есть слово await при вызове метода. Вот мне нужна альтернатива await :) Эти все вложенные функции слишком громоздкие и плохочитабельные. Я и так плохо понимаю это все, а с таким подходом заплутатся раз плюнуть. – Andrew Stop_RU_war_in_UA Jun 24 '17 at 09:37