2016-11-17 2 views
0

Я проверяю, существует ли стол в таблице. Если это не так, я вставляю его. Поэтому мне нужно сделать два асинхронных вызова. Могу ли я сделать это с обещаниями?Цепочное обещание

var insertOrUpdateBuilding = (callback)=>{ 
    // Check if building exists 
    db('buildings') 
     .where({externalId: buildingId}) 
     .then(function(rows){ 
     // Building exist, do nothing 
     if(rows){ 
      callback(); 
     } 
     // Building does not exist. Insert it 
     if(!rows){ 
      return db('buildings').insert({externalId: buildingId, name: req.body.name}) 
     } 
     }) 
     .then(function(promise){ 

     }) 
     .catch(function(err){ 
     callback({message: 'Error looking up building', err: err}) 
     }) 
    }; 

Я застрял. Как я могу продолжить?

+0

Как правило, вы не смешиваете обещания и обратные вызовы. Какую библиотеку базы данных вы используете? – Tomalak

+0

http://stackoverflow.com/questions/12273437/jquery-deferred-object-with-nested-ajax-calls –

+1

@SunilBN OP явно не использует отложенные объекты jQuery. – Tomalak

ответ

3

Обещания являются липкими, как только вы начнете их использовать, каждая задействуемая функция должна будет принять и вернуть обещания. В вашем примере, если db() обещано, то insertOrUpdateBuilding должен вернуть обещание тоже, то есть, db(...) с некоторыми then с прикрепленными к нему

var insertOrUpdateBuilding =() => db('buildings') 
    .where({externalId: buildingId}) 
    .then(rows => rows || 
     db('buildings').insert({externalId: buildingId, name: req.body.name})) 
    ; 

и тот, кто называет insertOrUpdateBuilding должен пообещать, а также:

insertOrUpdateBuilding().then(okay).catch(error!) 

Обратите внимание, что в случае ошибки catch в функции нижнего уровня обычно не имеет смысла (кроме ведения журнала/отладки). Пусть ошибка распространяется на верхний уровень, где вы можете обрабатывать его разумным способом, например. информировать пользователя.

0

Попробуйте использовать ES7 async/wait.

var async insertOrUpdateBuilding = (callback) => { 
    try { 
     // Check if building exists 
     let rows = await db('buildings') 
      .where({externalId: buildingId}); 
     // Building exist, do nothing 
     if (rows){ 
      callback(); 
     } 
     // Building does not exist. Insert it 
     if (!rows) { 
      let row = await db('buildings').insert({ 
      externalId: buildingId, 
      name: req.body.name 
      }); 
      callback(); 
     } 
    } catch (e) { 
     callback({message: 'Error looking up building', err: e}); 
    } 
}; 
+1

Не уверен, что это отвечает на вопрос. Вопрос был о обещаниях, асинхронный/ожидающий может быть недоступен. –

+0

@DavinTryon Спасибо за комментарий. Я только что добавил. Сначала пропустили его, чтобы не испортить принцип кода. –

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