我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文虽然是以npm scripts的名义来讨论&&&的区别,但是,大家要理解这个问题的实质是操作系统在命令行里面,对&&&符号的解析的问题。实际上与node无关,与npm项目无关。而且,这个问题的讨论结论中,都是有特殊条件的,并不是放之天下皆准则。而市面上的相关文章,都有意或无意的忽略了这个特殊条件。

苏南大叔:如何理解npm scripts中的&&和&任务连接符号? - 任务连接符号
如何理解npm scripts中的&&和&任务连接符号?(图8-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码感想感悟。本文测试环境:第一个,win10+node+npm。第二个,mac+node+npm。第三个,centos+node+npmwin系统下,结论是完全不同的。非win系统下,则是另外一个完全不同的结论。

结论表格

系统&&&on error &&on error &
win10串行串行整体停止执行不影响其它执行
mac13串行并行整体停止执行不影响其它执行
centos7串行并行整体停止执行不影响其它执行

结论是这样的,对于同样的使用&&或者&串联的命令:

  • win系统总是顺序执行任务。上一个任务没有完成的话,下一个任务也不会开始。
  • mac/centos下,&&是串行执行代码(前一个结束后一个开始),&则是并行同时执行。

而对于发生错误的情况,测试中的三个系统的测试结果表现一致。

  • &&会整体停止执行。
  • &则会转入下一个程序执行。

测试代码

分别编辑三个.js文件,用于演示执行:
1.js:

setInterval(() => {
  console.log('1');
  if (performance.now()>5000){
    throw new Error("1号发生错误");
  }
}, 1000);

2.js:

setInterval(() => {
  console.log('2');
  if (performance.now()>7000){
    throw new Error("2号发生错误");
  }
}, 1000);

3.js:

setInterval(() => {
  console.log('3');
  if (performance.now()>9000){
    throw new Error("3号发生错误");
  }
}, 1000);

使用编辑package.json文件中的scripts项目。

{
  //...
  "scripts": {
    "test_then": "node 1.js && node 2.js && node 3.js",
    "test_and": "node 1.js & node 2.js & node 3.js"
  },
  //...
}

苏南大叔:如何理解npm scripts中的&&和&任务连接符号? - 测试代码
如何理解npm scripts中的&&和&任务连接符号?(图8-2)

执行命令

意图为先后顺序的命令:

npm run test_then

意图为同时无先后顺序的命令:

npm run test_and

测试结果 windows

苏南大叔:如何理解npm scripts中的&&和&任务连接符号? - win-then
如何理解npm scripts中的&&和&任务连接符号?(图8-3)

苏南大叔:如何理解npm scripts中的&&和&任务连接符号? - win-and
如何理解npm scripts中的&&和&任务连接符号?(图8-4)

windows系统下,都是串行执行任务,在任务发生错误后,&&是全盘结束,&只是结束当前任务。

测试结果 mac

mac系统下,&&是串行,遇到错误全部停止执行。&并行,遇到错误只结束当前任务。

苏南大叔:如何理解npm scripts中的&&和&任务连接符号? - mac-then
如何理解npm scripts中的&&和&任务连接符号?(图8-5)

苏南大叔:如何理解npm scripts中的&&和&任务连接符号? - mac-and
如何理解npm scripts中的&&和&任务连接符号?(图8-6)

测试结果 centos

centos系统下,&&是串行,遇到错误全部停止执行。&并行,遇到错误只结束当前任务。

苏南大叔:如何理解npm scripts中的&&和&任务连接符号? - centos-then
如何理解npm scripts中的&&和&任务连接符号?(图8-7)

苏南大叔:如何理解npm scripts中的&&和&任务连接符号? - centos-and
如何理解npm scripts中的&&和&任务连接符号?(图8-8)

题外话

对于使用&的情况,可能会出现主线程退出后,子任务才有输出的情况。这个情况下,可以在命令行的最后面加个 & wait即可解决这个问题。例如:

node 1.js & node 2.js & node 3.js & wait

结束语

如果同时使用&&&的话,可以自行推理其效果。更多npm的使用经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   node    npm