В jquery $ .when (ajax) .done (function () {do sth}, как я могу выполнить обратный вызов дважды для одной и той же функции обратного вызова?

В jquery у меня есть следующий код:

Часть А:

$.when(result = $.startAsyncRequest(arg)).done(function(){
    console.info(result); // this should be called every time something is returned   
    if (result.hasOwnProperty("responseJSON")){
       console.info("build frontend table using completed task");
    }

});

Часть B:

jQuery.extend({

   startAsyncRequest: function(arg){
       console.info(arg);
       $.when(result = makeAjaxRequest(arg)).done(function(){
           var taskid = result.taskid;
           var taskurl = "someurl" + taskid;
           startProgressBar(taskurl, {
           onSuccess: function(){
               $.when(result2 = makeAjaxRequest(taskid)).done(function(){
                  console.info("received completed task"); 
                  return result2;
               });
           });
           return "starting progress bar";
       });
       return "started task";
    }

});

Часть A запускает функцию (Часть B), которая содержит несколько почтовых запросов ajax, все из которых отложены. Один из этих запросов выполняется на основе обратного вызова после завершения индикатора выполнения.

Каждый раз, когда возвращается startAsyncRequest, я хотел бы, чтобы он возвращался к Части A и записывал результат в консоль. Поэтому я ожидал, что он вернется туда несколько раз, но он вернется только один раз (первый запрос, «запущенная задача»).

Есть ли способ сделать это?

Я не хочу разбивать startAsyncRequest более чем на одну функцию, поскольку часть A часто повторяется в моем коде, и я хочу, чтобы все вызовы задачи, индикатор выполнения и логика получения задачи были объединены в одну функцию.

Чтобы вызвать обратный вызов несколько раз, используйте функции прогресса и уведомления об отложенном.

LNT 06.05.2018 19:34

Нет, с $.when() этого не сделать. Обещания выполняются / отклоняются только один раз, а не несколько раз. Самый простой - передать обратный вызов и просто вызвать его несколько раз в любой момент обработки.

Bergi 06.05.2018 19:57

я бы передал обратный вызов в качестве аргумента запроса или в части .done?

Kai Aeberli 06.05.2018 21:21

Комментарий Берги сработал - я передал функцию обратного вызова запросу как анонимную функцию и полностью избавился от части .done ().

Kai Aeberli 10.05.2018 21:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проверьте это: https://api.jquery.com/category/deferred-object/

function wrap(ajaxRequest){
  var defer = $.Deferred();
  ajaxRequest.done(function(resp){
     defer.notify({ "message" : "Done Success", resp : resp })
  }).fail(function(resp){
     defer.notify({ "message" : "Error Failure", resp : resp });
  });
  setTimeout(function(){
     defer.notify({ "message" : "Request is made", resp : null });
  })
  return defer.promise();
}

/// Calling function


  wrap($.ajax({
   // params
  })).progress(function(obj){
     console.info(obj)
  })
Ответ принят как подходящий

Решение было -

Часть А:

$.startAsyncRequest(arg, function(result){
    console.info(result); // this should be called every time something is returned   
    if (result.hasOwnProperty("responseJSON")){
       console.info("build frontend table using completed task");
    }

});

Часть B:

jQuery.extend({

   startAsyncRequest: function(arg, callbackFct){
       console.info(arg);
       $.when(result = makeAjaxRequest(arg)).done(function(){
           var taskid = result.taskid;
           var taskurl = "someurl" + taskid;
           startProgressBar(taskurl, {
           onSuccess: function(){
               $.when(result2 = makeAjaxRequest(taskid)).done(function(){
                  console.info("received completed task"); 
                  callbackFct(result2);
               });
           });
           return callbackFct("starting progress bar");
       });
       return callbackFct("started task");
    }

});

выглядит как поддельный ответ на вопрос, чтобы получить баллы самостоятельно. посмотри на мой ответ, jquery предоставит его прямо из коробки, тебе не нужно изобретать его заново.

LNT 01.01.2019 10:40

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