Вопросы, использующие отсрочку / Когда в JQuery отложить функцию

StackOverflow https://stackoverflow.com//questions/25054809

Вопрос

Я действительно борюсь с использованием отложенного или когда с моим сценарием jQuery. Я проходил через несколько статей здесь и в другом месте (включая API.jquery.com), и я думаю, что я просто слишком начинаю, чтобы точно понять, как использовать эти звонки.

Я пытаюсь отложить функцию под управлением, пока предыдущая функция в моем скрипте не завершена.

У меня есть

function datapoints () {
    //My long function here where I define $data
};
.

из которых результат - это массив с именем $ Data. Мне нужна эта переменная данных $ для определения в моей следующей функции, поэтому я хочу отложить его.

Я пытался настроить деферраль, как это:

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (){
    // My function here where I use $data
        }
    );
.

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

Спасибо заранее!

Это было полезно?

Решение

Попробуйте исправить код, как это:

deferred.done(function result (data){
    // Do not use global $data, use local 'data' instead
    }
);
.

Это обеспечит использование данных, на самом деле данные, возвращаемые datapoints().

Вы также должны знать, что если datapoints() не является Async-функцией, код, который вы написали, заблокирует нить JS (I.E., если запустить в браузере - он заблокирует интерфейс UI).

обещания / отложенные с синхронными функциями не так много используют.

Обычный шаблон будет что-то подобное:

function datapoints() {
   var d = $.Deferred()
   asyncCallToCreateDatapoints(function callback(data) {
      d.resolve(data)
   })
   return d;
}

datapoints().done(function result(data) {
   /* do stuff with data */
})
.

Другие советы

попробуйте этот код:

function datapoints () {
    var deferred = $.Deferred();

    /* later, when data is ready, call:

        deffered.resolve(data);
    */

    return deferred.promise();
}


datapoints().then(function () {
    // runs when data is ready         
})
.

Не правдиво уверен, что ваша проблема, но это jsfiddle работает нормально для меня.

function datapoints () {
    //My long function here where I define $data
    return {"datapoint1": 1, "datapoint2": 2};
};

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (data){
    // My function here where I use $data
    console.log("data: ", data);
});
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top