首页 > 解决方案 > 那么为什么总是用 undefined 调用呢?

问题描述

我有以下承诺链:

return new Promise((resolve, reject) => {
  isUserExists(user.username, user.email).then((existResult) => {
    /// already exists
    if (existResult.rows[0].exists == true) {
      reject('Already exists');
    } else {
      return insertCity({
        city_id: user.city_id,
        city_name: user.city_name
      });
    }
  }).then((cityResult) => {
    /// this is one is always called even I didn't called insertCity above
    console.log(cityResult); /// could be undefined if not called
    return insertUser(user); /// I don't want this to be executed
  });
});

如果用户已经存在,我调用reject('Already exists'). 但是无论如何,nextthen被调用,这意味着insertUser也被调用。我不希望它发生。我只想reject在任何时候被调用时停止一切。return reject( Already exists) 没有帮助。我该如何解决这个问题?看来我不明白 Promises 的核心内容。

标签: javascriptpromise

解决方案


您的代码中有几个问题:

  • 您不需要包装isUserExists(user.username, user.email)Promise构造函数中,因为它已经返回一个Promise.

  • 在第一个.then()方法的回调函数内部,调用reject()会拒绝新创建的方法,Promise但它不会停止执行第一个.then()方法的回调函数,直到它隐式返回undefined,然后调用第二个.then()块。

解决方案

您不需要Promise构造函数。一旦确定用户已经存在,就可以抛出错误。

return isUserExists(user.username, user.email)
   .then((existResult) => {
       /// already exists
       if (existResult.rows[0].exists == true) {
         throw new Error("already exists");
       }
       
       return insertCity({ city_id: user.city_id, city_name: user.city_name });
   })
   .then((cityResult) => {
       console.log(cityResult);
       return insertUser(user);
   });

确保.catch()在调用代码中添加块以在用户已经存在时处理错误。


推荐阅读