亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法讓js逐行執行這個腳本

有沒有辦法讓js逐行執行這個腳本

手掌心 2022-06-16 10:17:09
我正在嘗試制作一個腳本,每次我創建一個新的反應應用程序時都可以自動化我的項目,所以首先我制作了一個運行我的 main.js 腳本的 bat 文件這是bat文件@echo offsetlocal enableextensionsREM run my mainnode "C:\Windows\System32\automate\main.js" %1這是 main.js 文件const { exec } = require("child_process");const { replace, rename } = require("./file.js");const axios = require("axios").default;let state = {  cwd: "E:/WORK/Projects",  token: "[[my github token]]",  project: {    name: process.argv[2],    path: "E:/WORK/Projects/" + process.argv[2],    src: "E:/WORK/Projects/" + process.argv[2] + "/src",  },};// initlet { cwd, project, token } = state;////// main// create the appexec("create-react-app " + project.name, { cwd });// install debsexec("npm i node-sass", { cwd: project.path });// use sassrename(project.src + "/index.css", "index.scss");rename(project.src + "/App.css", "App.scss");replace(project.src + "/index.js", "./index.css", "./index.scss");replace(project.src + "/App.js", "./App.css", "./App.scss");// structure my applet code = [  'mkdir "' + project.src + '/App"',  'mkdir "' + project.src + '/App/Elements"',  'mkdir "' + project.src + '/App/nav"',  'touch "' + project.src + '/App/nav.jsx"',  'touch "' + project.src + '/App/nav/nav.scss"',];code = code.join(" && ");exec(code);// push to githubaxios({  method: "post",  url: "https://api.github.com/user/repos?access_token=" + token,  data: {    name: project.name,  },})  .then((res) => {    let repo = res.data.clone_url;    let c = [      "git remote add origin " + repo,      "git push --set-upstream origin master",      "git push",    ].join(" && ");    exec(c);  })  .catch((err) => {    console.log(err.response.data.errors);  });// open in codeexec("code " + project.path);// final messageconsole.log("Have Fun!");現在一切都準備好了,但我唯一的問題是每一行都被異步執行例如 create-react-app 命令這需要很多時間,并且每一行都取決于它首先完成
查看完整描述

3 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

您可以使用execSync代替exec

const {execSync} = require('child_process');

以下是有關此功能的主要文檔:NodeJs Docs

具體說明:

child_process.execSync() 方法通常與 child_process.exec() 相同,只是該方法在子進程完全關閉之前不會返回。當遇到超時并發送 killSignal 時,該方法將在進程完全退出之前不會返回。如果子進程攔截并處理了 SIGTERM 信號并且沒有退出,則父進程會一直等到子進程退出。


查看完整回答
反對 回復 2022-06-16
?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

這是一個可以使用鎖或信號量的經典案例。

只需在所需行之前鎖定執行,然后將其刪除。

參考this for locks in js - How to implement a lock in JavaScript


查看完整回答
反對 回復 2022-06-16
?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

您可以使用 util 模塊中的 promisify 將 async exec 函數轉換為 promise,然后您可以使用 await exec 以使其顯示為同步執行。


const util = require('util');

const exec = util.promisify(require('child_process').exec);

然后,您可以將代碼包裝在這樣的函數中:


async function init(){

  //your code

  await exec("create-react-app " + project.name, { cwd });

  //...

}

init();

對于像這樣的簡單腳本,execSync 實際上可能更容易,但在其他情況下您可能會發現異步版本更好。


查看完整回答
反對 回復 2022-06-16
  • 3 回答
  • 0 關注
  • 265 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號