2012-07-29 2 views
1

Я пытаюсь вызвать действие после того, как объект Javascript был создан с помощью вызова AJAX. Мой объект выглядит примерно так:Запуск обратного вызова Javascript после завершенного вызова ajax внутри объекта

function API(uid,accessToken){  
     $.ajax("path/to/file", { 
      type: "POST", 
      data: { user: uid, auth: accessToken }, 
      dataType: "json", 
      success: function(jsonData) { 
       arrayname = jsonData[values] 
      } 
     }); 
} 

Я пытался использовать $ .При функцию JQuery, чтобы сделать обратный вызов после установки объекта завершена, который выглядел как это (т.е. массив заполняется ответ AJAX.) :

 $.when(API = new API(uid, accessToken)).then(function() { 
       ...success function... 
     }); 

... но функция $.when триггеры со значениями ИмяМассива еще неопределенные. С точки зрения функции отложенный объект разрешается, даже если значения объекта еще не установлены. С тех пор я попробовал несколько способов сделать объект API отложенным на основе завершения всего вызова ajax и установки переменных, но я немного застрял на этом наилучшем пути.

Любые указатели были бы очень признательны! Благодарю.

+1

Спасибо, исправлена ​​эта ошибка (не связанная с проблемой). – Tempo71

ответ

0

Вы можете передать функцию обратного вызова при создании объекта, например, так:

function API(uid,accessToken, callback){  
     $.ajax("path/to/file", { 
      type: "POST", 
      data: { user: uid, auth: accessToken }, 
      dataType: "json", 
      success: function(jsonData) { 
       arrayname = jsonData[values] 
       callback(jsonData[values]) 
      } 
     }); 
} 

, а затем создать экземпляр объекта, как так

var api = new API(uid, accessToken, function(array) { 
    // success function 
}); 
+0

Спасибо, и да, я делал это раньше и, конечно же, это работает. Тем не менее, я абстрагирую эти объекты данных от пользовательского интерфейса и должен иметь возможность использовать их во всем приложении - другими словами, функция обратного вызова для одного и того же объекта/метода может варьироваться в зависимости от обстоятельств. Вот почему я надеялся использовать функцию JQuery $ .when, если это возможно. – Tempo71

+0

Хм, тогда я в замешательстве. Если вызов ajax находится там, где он есть, будет ли он работать только один раз, при инициализации? –

+0

Этот будет, но другие методы на этом объекте (каждый из которых может выполнять вызов ajax) могут выполняться произвольно во всем приложении. Я хочу отделить объекты данных от представлений, которые его используют. Например, метод позволяет мне получать теги, связанные с определенным объектом, и они могут отображаться по-разному в разное время. Следовательно, наличие обратных вызовов вне функций, которые собирают объекты, является целью. – Tempo71

0

Если проблема связана с «успехом» обратный вызов после «затем» обратных вызовов, вы можете попытаться включить обратный вызов успеха в последующий обратный вызов. Я не использую JQuery, но я предполагаю, что это будет выглядеть примерно так:

function API(uid,accessToken){  
    return $.ajax("path/to/file", { 
     type: "POST", 
     data: { user: uid, auth: accessToken }, 
     dataType: "json", 
    }).then(function(jsondata){ 
     arrayname = jsondata[values] 
    }); 
} 

$.when(API = new API(uid, accessToken)).then(function() { 
    // ... 
}); 
0

Причиной вы используете $.when когда вы соотнесения обратных вызовов нескольких обещаний, асинхронные задач и т.д. Так как JQuery 1.5, все вызовы $.ajax и все обертки ($.get и $.post) все возвращаются promises. Поэтому вам не нужно обертывать этот вызов с помощью инструкции $.when, если вы не хотите делать $.when(ajaxCall1, ajaxCall2).

Так как вы хотите, чтобы отфильтровать результат от сервера, вы должны использовать pipe метод обещаний:

function API(uid, accessToken) 
    return $.post(
    type: 'POST' 
    ,data: { user: uid, auth: accessToken } 
    ,dataType: 'json' 
) 
    .pipe(function(json) { 
     return json[values]; 
    }) 
    ; 
} 

Это позволяет писать код так, как вы хотите:

API(uid, token) 
    .then(
    // success state (same as promise.done) 
    function(arrayname /* named from your sample script*/) { 
     alert('success! ' + arrayname); 
    } 
    // error state (same as promise.fail) 
    ,function(jqXHR, status, error) { 
     console.warn('oh noes!', error); 
    } 
) 
    .done(function() { /* done #2 */ }) 
    .fail(function() { /* fail #2 */ }) 
; 

Примечание. promise.pipe() также позволяет фильтровать (изменять переданные данные) обратный вызов ошибки.

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