承诺内部承诺

通りす*_*っさん 9 javascript promise sails.js knex.js

我试图用Promise编写这段代码.但我不知道如何在Promise和循环中写承诺.我试着像这样想,但insertBook函数变得异步.如何同步获取bookId?

update: function(items, quotationId) {
  return new Promise(function(resolve, reject) {
    knex.transaction(function (t) {
      Promise.bind(result).then(function() {
        return process?
      }).then(function() {
        return process?
      }).then(function() {
        var promises = items.map(function (item) {
          var people = _.pick(item, 'familyName', 'firstNumber', 'tel');
          if (item.type === 'book') {
            var book = _.pick(item, 'name', 'bookNumber', 'author');
            var bookId = insertBook(t, book);
            var values = _.merge({}, people,  {quotation: quotationId}, {book: bookId});
          } else {
            var values = _.merge({}, people,  {quotation: quotationId});
          }
          return AModel.validateFor(values);
        });
        return Promise.all(promises);
      }).then(function(items) {
        var insertValues = items.map(function (item) {
          return People.columnize(item);
        });
        return knex('people').transacting(t).insert(insertValues);
      }).then(function() {
        return process5
      }).then(function() {
        ...........

      }).then(function() {
        t.commit(this);
      }).catch(t.rollback);
    }).then(function (res) {
      resolve(res);
    }).catch(function(err) {
      reject(err);
    });
  });
}

function insertBook(t, book){
  return Promise.bind(this).then(function () {
    return Book.columnizeFor(book);
  }).then(function (value) {
    return knex('book').transacting(t).insert(value, "id");
  });
}
Run Code Online (Sandbox Code Playgroud)

Mau*_*ppe 0

假设insertBook返回一个你可以做的承诺

var people = _.pick(item, 'familyName', 'firstNumber', 'tel');
if (item.type === 'book') {
  var book = _.pick(item, 'name', 'bookNumber', 'author');
  return insertBook(t, book)
    .then(bookId => _.merge({}, people,  {quotation: quotationId}, {book: bookId}))
    .then(AModel.validateFor)
} else {
  return Promise.resolve(_.merge({}, people,  {quotation: quotationId}))
    .then(AModel.validateFor)
}
Run Code Online (Sandbox Code Playgroud)