2015-03-08 2 views
0

Я действительно новичок в обещаниях (я использую обещания bluebird с expressjs). Мне нравится, как они убирают код. Однако я не совсем уверен, как использовать их в некоторых сценариях. Я даже не уверен, что использую их прямо в моем примере.Есть ли способ передать пользовательские данные в. Then часть обещаний?

Вопрос, который у меня есть, заключается в том, что я хотел бы передать правду или фальшь, чтобы «затем» часть обещания. Я прокомментировал приведенный ниже код для получения дополнительной информации.

Спасибо заранее!

//data is an array of javascript objects 
Promise.each(data, function(d){ 
    delete d.offset; 
    if (d.driver_id == -1) d.driver_id = null; 

    Promise.try(function(){ 
     return new Term().where({'date_of_driving': d.date_of_driving}).fetch() 
    }) 
    .then(function(result){ 

     d.updated_at = dater.formatDate(new Date(), true); 
     if (result !== null) { 
      //update 
      var res = result.toJSON(); 
      return new Term({'id': res.id}).save(d); 
     } else { 
      //save 
      d.created_at = dater.formatDate(new Date(), true); 
      return new Term().save(d);    
     } 
    }).then(function(item){ 
      //I need to know here if before I saved or updated Term record 
      //is there a way to pass a truthy or falsy variable? 
    }) 
}) 
.then(function(terms){ 

}) 
.catch(function(error){ 
    callback(false); 
}); 
+0

Какую версию nodejs/iojs вы используете? –

ответ

1

Я даже не уверен, что я их использовать прямо в моем примере.

Похоже, вы забыли return обещание от вашего each() обратного вызова. Кроме того, я не уверен, нужна ли вам эта обертка Promise.try, я бы подумал, что использование обещания, возвращенного .fetch(), должно быть довольно безопасным.

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

Я думаю, что самый простой способ здесь гнездиться на then звонков, и поставить обратные вызовы прямо для соответствующего .save() вызова.

return new Term().where({'date_of_driving': d.date_of_driving}).fetch() 
.then(function(result){ 
    d.updated_at = dater.formatDate(new Date(), true); 
    if (result !== null) { 
     var res = result.toJSON(); 
     return new Term({'id': res.id}).save(d) // update 
     .then(function(item) { 
      // here you know that before you updated the Term record 
     }); 
    } else { 
     d.created_at = dater.formatDate(new Date(), true); 
     return new Term().save(d) // save 
     .then(function(item) { 
      // here you know that before you saved the Term record 
     }); 
    } 
}) 

В принципе, если ваша проблема сводится к тому, доступ к выражению result !== null см How do I access previous promise results in a .then() chain? другие подходы.

+0

Спасибо, это определенно один из способов решения вещей. Я действительно надеялся использовать как можно больше цепочки, и я пришел к этому решению. Не могли бы вы рассмотреть его и прокомментировать, есть ли проблемы с тем, как я подхожу к вещам? http://www.codeshare.io/QErX0 Спасибо! – uglycode

+0

Да, это сработает. Обратите внимание, что 'return Promise.resolve();' можно просто пропустить. Тем не менее, я не вижу причин, чтобы цепочки здесь, так как вы * хотите * управлять потоком ветвления, который достигается посредством блоков вложенности. Взгляните на мое обновление по вашему коду (у него нет версий, не так ли?) – Bergi

+1

Берги благодарю вас за ваше объяснение! Это замечательно! Я понимаю обещания сейчас немного лучше. – uglycode

0

На самом деле это довольно легко. Один из способов - добавить состояние к окружающей функции (что в вашем случае, я думаю, идеально подойдет вашим потребностям).

//data is an array of javascript objects 
Promise.each(data, function(d){ 
    var updated; // state var 
    delete d.offset; 
    if (d.driver_id == -1) d.driver_id = null; 

    return Promise.try(function(){ 
     return new Term().where({'date_of_driving': d.date_of_driving}).fetch() 
    }) 
    .then(function(result){ 

     d.updated_at = dater.formatDate(new Date(), true); 
     if (result !== null) { 
      //update 
      updated = true; 
      var res = result.toJSON(); 
      return new Term({'id': res.id}).save(d); 
     } else { 
      updated = false; 
      //save 
      d.created_at = dater.formatDate(new Date(), true); 
      return new Term().save(d);    
     } 
    }).then(function(item){ 
      // Here, you can use the updated variable. 
    }) 
}) 
.then(function(terms){ 

}) 
.catch(function(error){ 
    callback(false); 
}); 
+0

Небольшое объяснение того, что вы сделали, сделало бы это лучшим ответом. Как и сейчас, нам остается попытаться сравнить этот код с оригиналом, чтобы выяснить, что вы сделали. – jfriend00