等待函数返回,然后再移至下一行

时间:2019-08-02 17:15:27

标签: javascript node.js

我正在尝试开发一种具有以下功能的方法: -调用返回类对象的函数 -将此对​​象推送到数组 -打印新数组

返回类对象的函数使用exec()函数来使用命令行执行脚本。这可能需要花费几秒钟的时间。

SampleFunction(data) {

    const xyzObject = xyz.otherfunction(data); 
    //other function takes a number of seconds to finish

    this.array.push(xyzObject); // Push object onto the array
    console.log(array);
    return xyzObject;
}

在我的代码中,甚至在返回对象之前,将数组打印到控制台。我该如何解决?

3 个答案:

答案 0 :(得分:3)

理想情况:重新组织代码,使其正确处理exec是异步操作这一事实。例如,您的函数可以接受回调或返回承诺,而不是直接返回结果。

在大多数情况下,它是非常第二好的答案:您可以使用execSync

答案 1 :(得分:0)

我建议阅读有关该主题的this blogpost

基本上,您需要将调用转换为Promise,然后在等待命令完成时使用async / await运算符暂停线程。

答案 2 :(得分:0)

遵循这些思路可以完成工作:

// const { exec, execFile } = require('child_process');

const xyz = {
  otherfunction: data => {
    return new Promise((resolve, reject) => {
      // you do your exec() here with something like that:
      // exec('<command>', (err, stdout, stderr) => {
      // execFile('<file>', (err, stdout, stderr) => {
      //   if (err) { reject(err) }

      //   resolve(stdout);
      // });
      setTimeout(() => {
        resolve(data);
      }, 1000);
    });
  }
};

const SampleFunction = async function(data) {
  let array = [];

  const xyzObject = await xyz.otherfunction(data); 
  //other function takes a number of seconds to finish

  array.push(xyzObject); // Push object onto the array
  console.log(array);
  return xyzObject;
}

SampleFunction([
  {city: 'Los Angeles', state: 'CA', population: '4M'},
  {city: 'New York City', state: 'NY', population: '8.4M'},
  {city: 'Atlanta', state: 'GA', population: '0.5M'},
]);

如果您实际上正在执行脚本文件,建议您使用execFile