将promise设置为变量并在以后使用它

时间:2016-12-20 08:55:38

标签: node.js promise ecmascript-6 es6-promise

我想以下列方式为变量分配一个承诺:

const createSingleUser = function createSingleUser(userData) {
  return new Promise((resolve, reject) => {
    new User(userData)
    .save()
    .then((user) => {
      resolve(user, 'user');
    })
    .catch((error) => {
      reject(error);
    });
  });
};

let createUsers;
if (users instanceof Array) {
  // If we have an array, we're batch creating users
  createUsers = new User().createBatchUsers(users); // returns promise
} else {
  // If we have a single object, we're only creating one user
  createUsers = new User().createSingleUser(users); // returns promise
}
createSingleUser(users)
createUser
.then((result) => {
.....

然而,由于时间问题,这不起作用。是否有另一种方法来制作这样的构造而不必两次编写承诺链?

编辑正如@torazaburo所提到的,如果您创建了一个承诺,它将开始运行。您可以将其分配给变量,但变量将表示正在运行的承诺。这是我面临的问题。这是因为createSingleUser是一个(Promise)对象,而不是一个函数。

2 个答案:

答案 0 :(得分:3)

您只需编写一次承诺链:

let createdUsers;
if (users instanceof Array) {
  createdUsers = new User().createBatchUsers(users);
} else {
  createdUsers = new User().createSingleUser(users);
}
// createSingleUser(users)
// ^^^^^^^^^^^^^^^^^^^^^^^ make sure to drop this line
createdUsers
.then((result) => {
    … // handle both cases here
})

答案 1 :(得分:1)

相当不清楚的问题,所以这里有几个答案。

您可以使用Promise.all(arrayOfPromises)then()之前等待多个承诺。

如果您需要运行两次,可以将if-else代码放在函数中:

function createUsers(users) {
  if (users instanceof Array) {
    return new User().createBatchUsers(users);
  }
  return new User().createSingleUser(users);
}

createUsers(users)
  .then(() => createUsers(users))
  .then(...);