Node.js承诺使用定义的函数链接.then()

时间:2020-04-08 05:25:48

标签: javascript node.js promise

如何使用.then()链接来调用Node.js中声明的函数?问题是在调用getFileType()之后,我想调用getExif(),但这会引发语法错误:

'use strict';

const FileType = require('file-type');
const exif = require('jpeg-exif');

const path = './alcatraz.jpg';

async function getFileType(filePath) {
    return await FileType.fromFile(filePath);
}

function getExif(filePath) {
    return new Promise((resolve, reject) => {
        exif.parse(filePath, (error, result) => {
            if(error) {
                reject(error);
            } else {
                resolve(result);
            }
        });
    });
}

getFileType(path).then((result) => {
    console.log(result);
})
# ======> problem is here <======
.then(getExif(path) {
    console.log(result);
})
.catch((error) => {
    console.error(error.message);
    process.exit(3);
});

语法错误是:

SyntaxError: missing ) after argument list

2 个答案:

答案 0 :(得分:3)

您应该将通话返回到上方getExif(path)内的.then,以便下方.then可以使用它:

getFileType(path).then((result) => {
    console.log(result);
    return getExif(path);
})
.then((result) => {
    console.log(result);
})
.catch((error) => {
    console.error(error.message);
    process.exit(3);
});

下部result中的.then变量将包含调用getExif的结果。如果您希望getFileTypegetExif都解析值,因为它们看起来并不相互依赖,请改用Promise.all

Promise.all([
  getFileType(path),
  getExif(path),
])
  .then(([fileType, exif]) => {
    // work with results
  })
  .catch((error) => {
    console.error(error.message);
    process.exit(3);
  });

答案 1 :(得分:0)

也许您想这样做以获得getExif的结果。

getFileType(path)
  .then((result) => {
    console.log(result);
  })
  .then(getExif(path)
    .then(resultOfGetExif => console.log(resultOfGetExif))
  )
  .catch((error) => {
    console.error(error.message);
    process.exit(3);
  });

或仅运行getExif

getFileType(path)
  .then((result) => {
    console.log(result);
    return result;
  })
  .then((result) => {
    getExif(path)
    console.log(result);
  })
  .catch((error) => {
    console.error(error.message);
    process.exit(3);
  });

希望这些对您有所帮助。