Javascript "Run To Completion"

使用Javascript也有几个月的时间了,今天发现了这个一个让我诧异事情:

Promise 的resolve和reject方法

我需要在使用Node写一个在数据库中插入用户的函数,代码如下:

const add = (email, password, repassword) => {
  return new Promise((resolve, reject) => {
    if (!password) {
      reject(new Error("password can't be empty"));
    }

    if (password !== repassword) {
      reject(new Error("password is not equals to repeat password"));
    }

    if (!validatePassword(password)) {
      reject(new Error('Password must contains at least: 2 lower case letters, 2 upper case letters  and 2 digits'));
    }

    const {salts} = security;
    pwd.hash(password, salts, (error, hash) => {
      if (error) reject(error);

      getUserByEmail(email)
        .then(user => {
          if (user) {
            reject(new Error('email already exist'));
          }

          insertAdminUser(email, hash)
            .then(result => resolve(result))
            .catch(error => reject(error));
        });
    });

  });
};

验证不成功调用reject,最后添加用户成功调用resolve,看起一切都很好。但是当我添加一个不符合验证要求的password,如:

add("ishuiyutian@gmail.com", "123456", "123456")
  .then(result => {})
  .catch(error => {
    console.log(`add user failed, error: ${error}`);
  });

如我所期望的那样,程序逻辑进入了catch中,打印出了:
add user failed, error:'Password must contains at least: 2 lower case letters, 2 upper case letters and 2 digits

但是出乎意料的是,数据库中同时生成了一条username: ishuiyutian@gmail.com, password: 123456记录,这说明程序逻辑走到了insertAdminUser,调用insertAdminUser生成了那条记录。

也就是说,当调用reject后,Promise并没有停下来,而是继续执行了下去。

在网上查了查,得到了这个的结论:

Javascript 有一个 "Run To Completion"的概念,这个概念是这样子的:

Unless an error is thrown, a function is executed until a return
statement or its end is reached. Other code outside of the function can't interfere with that (unless, again, an error is thrown).

也就是说,除非程序抛出了一个异常,否则这个function将会继续执行,直到遇到return这个statement或者这个程序已经运行到了结尾。在这个function外部的其它代码不能干扰它的执行。

所以,如果我们想使用reject()后并返回,我们需要在它前面加上return,如:

if (!password) {
   return reject(new Error("password can't be empty"));
}

Express 的next方法

对于express 的next方法也是同样的情况,如下代码:

export const checkUserDeletePermission = ({userId}, res, next) => {
  if (!doesUserHaveDeleteFunctionPermission(userId)) {
    next(new UnauthorizedException('You are not permitted to delete'));
  } 
  next();
};

如果代码逻辑进入到了if代码块中,执行了next(new UnauthorizedException('You are not permitted to delete listing'))方法,但是后程序并没结束,它依然会执行后面的next()方法,直到这个函数执行完成。

所以,最好是将后面的next()放在else块中,如:

export const checkUserDeletePermission = ({userId}, res, next) => {
  if (!doesUserHaveDeleteFunctionPermission(userId)) {
    next(new UnauthorizedException('You are not permitted to delete'));
  } else {
    next();
  }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容