Вопросы, использующие отсрочку / Когда в JQuery отложить функцию
-
21-12-2019 - |
Вопрос
Я действительно борюсь с использованием отложенного или когда с моим сценарием 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);
});
.