2016-10-07 2 views
0

я сделать вызов функции, составляющим Ajax вызов, как это:Когда можете использовать. Then использовать текущее возвращаемое значение?

send.startMonitoring({'fetchMethod': 'notificationInterval', 'lastmodif':0}).then(function(value){ 
console.debug(value); 
}); 

Но ошибка, я получаю это:

Uncaught TypeError: Cannot read property 'then' of undefined in jquery

Как и выше, я звоню startMonitoring функция, находящаяся на другой странице и передающая объект для создания ajax-вызова на сервер. Эта функция возвращает значение с сервера, и я хочу что-то с ней сделать. Вот почему я пытаюсь использовать. Then для обработки возвращаемого значения.

Since I'm getting the above error, how could I modify it so that returned value can be processed? Also how and when I can use .then()?

var interface = (function(config) { 

     return { 

       transporter: function(options) { 
        return config.ajax(options); 
       }, 

       startMonitoring: function(options) { 

        var PERIOD_NOT_VISIBLE = 60000; 
        var PERIOD_VISIBLE = 5000; 
        var timer = 0; 
        var timestring = 0; 

        (function callThis(timestamp) {     

         interface.transporter(options).then(function(value) { 

          if (value[1].notification[0].output == null) { 
           timestring = value[1].notification[0].lastmodif; 
           console.log(timestring); 
           return value; 
          } 


         }).catch(function(e) { 

         }); 

         timer = setTimeout(function(){ 

         callThis(); 
          if (interface.isMonitoring() == 0) { 
          clearTimeout(timer); 
          } 
         }, (document.hidden) ? PERIOD_NOT_VISIBLE : PERIOD_VISIBLE); 

        })(); 
       } 
     }; 

})(settings); 

Это как Ajax звонки сделаны:

ajax: function(opt) { 

     var defaultData = settings.getDefaultDataset(); 
     var self = this; 
     var opt = $.extend({}, defaultData, opt); 
     var output = []; 
     return new Promise(function(resolve, reject) { 
      token = window.es.token; 
      opt[token] = "1"; 
      jQuery.ajax({ 

       method: "POST", 
       url: self.system.path+"/index.php", 
       "data": opt, 
       error: function() { 
        reject('error'); 
       }, 
       success: function(result) { 
        output.push(opt, result); 
        resolve(output);   
       } 
      }); 

     }); 
    } 
+0

что делает функцию 'send.startMonitoring' вернуться ...' Эта функция возвращает значение из server' - явно нет. .. Я уверен, что это вопрос «как вернуть значение из асинхронного вызова» - проблема в коде, который вы ** не указали ** показано –

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) –

+0

'как и когда я могу использовать .then()' когда объект, re using '.then()' on - это объект с свойством, называемым 'then', который является' functi on' –

ответ

1

Изменить startMonitoring принять и вызвать параметр, CallBack

startMonitoring: function(options, callback) { 
    var PERIOD_NOT_VISIBLE = 60000; 
    var PERIOD_VISIBLE = 5000; 
    var timer = 0; 
    var timestring = 0; 
    (function callThis(timestamp) { 
     interface.transporter(options).then(function(value) { 
      callback(value); 
     }).catch(function(e) { 
     }); 
     timer = setTimeout(callThis, (document.hidden) ? PERIOD_NOT_VISIBLE : PERIOD_VISIBLE); 
    })(); 
}, 

прибраться ajax удалить конструктор анти Promise -паттерн и использовать. Затем обещание, возвращенное jQuery.ajax

ajax: function(opt) { 
    var defaultData = settings.getDefaultDataset(); 
    var opt = $.extend({}, defaultData, opt); 
    var output = []; 
    var token = window.es.token; 
    opt[token] = "1"; 
    return jQuery.ajax({ 
     method: "POST", 
     url: this.system.path + "/index.php", 
     "data": opt, 
    }) 
    .then(function(result) { 
     output.push(opt, result); 
     return output; 
    }); 
} 

Изменить, как вы называете startMonitoring передать в функцию обратного вызова

send.startMonitoring({'fetchMethod': 'notificationInterval', 'lastmodif':0}, function callback(value){ 
    console.debug(value); 
}); 
+0

спасибо, он работает, за исключением того, что исправление ajax бросает некоторую ошибку, говоря ... $. Ajax.then() .... catch() не является функцией ... но это нормально. Я буду изучать отложенные объекты. – 112233

+0

Я немного подозреваю в 'var output = [];' then 'output.push (opt, result); return code; code ... это всегда будет когда-либо возвращать массив с двумя элементами: 'opt' и' result' ... Я подозреваю, что вы могли полностью удалить var 'output' и просто' return [opt, result]; ' –

+0

какую версию jQuery вы используете? Я думаю, что у какой-то старой версии не было '.catch' –

0

В JQuery, вы можете использовать функцию $ .Deferred(). Например:

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

    jQuery.ajax({ 
     url: your_url, 
     type: 'GET', 
     success: function (data) { 
      deferred.resolve(data); 
     }, 
     error: function (error) { 
      deferred.reject(error); 
     } 
    }); 

    return deferred.promise(); 
} 

Затем вы можете вызвать вашу функцию:

startMonitoring().done(function (data) { 
    //Went well 
}).fail(function (error) { 
    //Error 
}); 
+0

Это классический анти-шаблон ..... '$ .ajax' уже возвращает обещание. Вы не должны использовать '$ .Deferred()' для создания нового, когда он уже существует – charlietfl

Смежные вопросы