Node.js 将承诺设置为变量并在以后使用

Node.js 将承诺设置为变量并在以后使用,node.js,promise,ecmascript-6,es6-promise,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) =>

我希望通过以下方式将承诺分配给变量:

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对象,而不是一个函数。

这个问题很不清楚,所以这里有一些答案

您可以使用Promise.allarrayOfPromises来等待多个承诺,然后再执行

如果需要运行函数两次,可以将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(...);

这个问题很不清楚,所以这里有一些答案

您可以使用Promise.allarrayOfPromises来等待多个承诺,然后再执行

如果需要运行函数两次,可以将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(...);

您只编写了一次承诺链:

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
})

您只编写了一次承诺链:

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
})

嗨,我不明白你在哪里写了两次承诺。为什么要在createUser之前的IF语句之后创建新的User.createSingleUserusers.thenresult=>{…句子?什么由于时间问题而不起作用?如果创建承诺,它将开始运行。您可以将其分配给变量,但变量将表示运行的承诺。这似乎不是您想要的。您可能想要做的是将创建承诺的函数存储到变量中,然后,当您准备好o运行它,通过调用上面的承诺获得承诺,它将是createUser。然后…顺便说一句,避免使用!@adnan Yes it反模式,请仔细阅读链接的答案。您已经有一个由async save方法返回的承诺,因此您不需要另一个承诺来包装它。整个过程应该简化为函数创建SingleUserData{return new userdata.save;}嗨,我不明白你在哪里写了两次承诺。为什么你要在createUser之前的IF语句之后创建new User.createSingleUserUserUsers。thenresult=>{…句子?什么由于时间问题而不起作用?如果创建承诺,它将开始运行。您可以将其分配给变量,但变量将表示运行的承诺。这似乎不是您想要的。您可能想要做的是将创建承诺的函数存储到变量中,然后,当您准备好o运行它,通过调用上面的承诺获得承诺,它将是createUser。然后…顺便说一句,避免使用!@adnan Yes it反模式,请仔细阅读链接的答案。您已经有一个由async save方法返回的承诺,因此您不需要另一个承诺来包装它。整个过程应该简化为函数创建SingleUserData{return new userdata.save;}