将第二个价值传递给承诺

时间:2019-06-12 01:52:10

标签: javascript promise

在这里,我使用全局变量usergb,因为在获得购物车的“ then”块中,我无法再访问该用户。如何通过购物车传递用户,而不必创建全局usergb?

var usergb;
sequelize
  .sync()
  .then(result => {
    return User.findByPk(1);
  })
  .then(user => {
    if (!user) {
      return User.create({ name: 'Max', email: 'test@test.com' });
    }
    return user;
  })
  .then(user => {
    usergb = user;
    return user.getCart();
  })
  .then(cart => {   // here I lost the reference to user
    if (!cart) {
      return usergb.createCart();
    }
    return cart
  })
  .then(cart => {
    app.listen(3000);
  })
  .catch(err => {
    console.log(err);
  });

2 个答案:

答案 0 :(得分:0)

返回包含Promise.alluser调用的数组的createCart(),您将在下一个.then中访问这两者:

sequelize
  .sync()
  .then(result => {
    return User.findByPk(1);
  })
  .then(user => {
    if (!user) {
      return User.create({ name: 'Max', email: 'test@test.com' });
    }
    return user;
  })
  .then(user => {
    return Promise.all([user, user.getCart()]);
    // ^^^^^^^^^^^^^^^^^^^^^^^^
  })
  .then(([user, cart]) => {
    // ^^^^^^^^^^^^^^^^^^^^^^^^
    if (!cart) {
      return user.createCart();
    }
    return cart
  })
  .then(cart => {
    app.listen(3000);
  })
  .catch(err => {
    console.log(err);
  });

您可以考虑使用async / await来提高代码的可读性:

try {
  const result = await sequelize.sync();
  const user = await User.findByPk(1) || await User.create({ name: 'Max', email: 'test@test.com' });
  const cart = await user.getCart() || await user.createCart();
  app.listen(3000);
} catch (err) {
  console.log(err);
}

答案 1 :(得分:0)

嵌套您需要引用user的promise。

sequelize
  .sync()
  .then(result => {
    return User.findByPk(1);
  })
  .then(user => {
    if (!user) {
      return User.create({ name: "Max", email: "test@test.com" });
    }

    return user;
  })
  .then(user => {
    return (
      user
        .getCart()
        // Nest the next promise here
        .then(cart => {
          if (!cart) {
            return usergb.createCart();
          }

          return cart;
        })
    );
  })
  .then(cart => {
    app.listen(3000);
  })
  .catch(err => {
    console.log(err);
  });