2015-06-05 2 views
0

Я знаком с созданием моделей в синхронной среде, такой как PHP или Ruby, но это в JS довольно отличается.Создание моделей в JS с вызовами Async API

Вот модель, с которой я только что начал, и нахожусь в тупике, как я собираюсь вернуть свою ценность.

var Activity = { 
    get: function(params) { 
     if (params.id) { 
      return Activity.getById(params.id); 
     } 
    }, 

    getById: function(id) { 
     $.get('/activities', {id: id}) 
      .success(function(activity) { 
       return activity[0]; 
      }); 
    } 
}; 

В .success() Я хочу вернуть свой результат обратно getById, но так как это в обратный вызов, я не совсем уверен, куда он идет.

В любом случае, когда я запускаю это в консоли, я просто получаю undefined.

Что я могу сделать здесь, чтобы вернуться в этот асинхронный стиль?

ответ

0

Действительно, вы не можете просто вернуться сюда.

Один из способов будет вызывать функцию обработчика с соответствующим параметром:

getById: function(id) { 
    $.get('/activities', {id: id}) 
     .success(function(activity) { 
      successFunction(activity[0]); 
     }); 
} 
0

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

getById: function(id, callback) { 
    $.get('/activities', {id: id}) 
     .success(function(activity) { 
      callback(activity[0]); 
     }); 
} 

В асинхронном программировании, обратные вызовы, как вы «ждать» он должен вернуться.

0

Не используйте обратный вызов, используйте обещания или отложенные, если вы хотите «своего рода» код синхронизации. (То есть он выглядит синхронизации с помощью возврата, даже если он является асинхронной за сценой)

Вы в основном просто пропустили в вашем коде на return:

var Activity = { 
    get: function(params) { 
     if (params.id) { 
      return Activity.getById(params.id).then(function(activity){ 
       console.log(activity) 
      }); 
     } 
    }, 

    getById: function(id) { 
     return $.get('/activities', {id: id})// You need to return this! 
      .success(function(activity) { 
       return activity[0]; 
      }); 
    } 
}; 

Теперь вы можете просто назвать его так:

Activity.get({id: 5}).then(function(activity){JSON.stringify(activity)}) 

Это будет записывать две версии: объект один, а затем стробированный.


Смотрите последний пример оттуда: https://api.jquery.com/deferred.then/

var request = $.ajax(url, { dataType: "json" }), 
    chained = request.then(function(data) { 
    return $.ajax(url2, { data: { user: data.userId } }); 
    }); 

chained.done(function(data) { 
    // data retrieved from url2 as provided by the first request 
}); 

Вы можете использовать then или done, но если вы используете done тогда вы не будете в состоянии сделать что-нибудь еще после этого, в то время как с помощью then позволяет вам цепочки столько, сколько вы хотите.

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