异步问题,.then之后无法运行shelljs命令

时间:2018-10-22 22:01:22

标签: javascript node.js promise shelljs

更新:在写入文件后,我添加了一个短暂的暂停,直到shell命令才起作用。

MyModel.upload

原始问题

async function testRun() { await createInsertCurlReq.createInsertCurlReq(process.argv[2]); await timeout(3000); shell.chmod("+x", "./curl.sh"); shell.exec("./curl.sh"); } } 之后,我的.then()块未运行。我应该如何重写它以便做到这一点?我注意到如果不删除文件而只是将其追加到该脚本,则会运行。

createInsertCurlReq.createInsertCurlReq(process.argv[2])

2 个答案:

答案 0 :(得分:0)

我相信问题是您在then的最后一个createInsertCurlReq调用中有一个同步循环。不同但相关的问题:Using async/await with a forEach loop

尝试将其替换为:

const {promisify} = require('util');

const appendFileAsync = promisify(fs.appendFile);
// ...
.then(data => Promise.all(data.map(() => appendFileAsync(
  "curl.sh",
  `curl -X POST -H "xxx"`
).catch(err => { throw err; }))));

这样,所有fs.appendFile的呼叫都将在进入下一个then之前解决。

如果您不介意引入模块,则还可以使用async-af重构为异步的forEach方法:

const {promisify} = require('util');
const AsyncAF = require('async-af');

const appendFileAsync = promisify(fs.appendFile);
// ...
.then(data => AsyncAF(data).forEach(() => appendFileAsync(
  "curl.sh",
  `curl -X POST -H "xxx"`
).catch(err => { throw err; })));

答案 1 :(得分:0)

createInsertCurlReq 中,当没有异步操作时,可以使用jsut链式传递数组。试试这种格式:

async function testRun() {
  if (fs.existsSync('./curl.sh')) {
    shell.rm('-rf', './curl.sh');
  }
  await createInsertCurlReq.createInsertCurlReq(process.argv[2])
  shell.chmod('+x', './curl.sh');
  shell.exec('./curl.sh');
}

async function createInsertCurlReq(filePath) {
  const data = await utils.readJSONFileOnDisk(filePath);
  const obj = JSON.parse(data);
  let resultArr = [];
  for (let key in obj) {
    for (let innerKey in obj[key]) {
      let arrayNew = {};
      arrayNew[key] = obj[key][innerKey].resolved;
      resultArr.push(arrayNew);
    }
  }
  if (!fs.existsSync("./curl.sh")) {
    shell.touch("./curl.sh");
  }
  for (let i = 0; i < resultArr.length; i++) {
    for (let key in resultArr[i]) {
      fs.appendFileSync(
        "curl.sh",
        `curl -X POST -H "xxx"`
      );
    }
  }
}