NodeJS 承诺curried(高阶函数)回调

0yg35tkg  于 2022-12-12  发布在  Node.js
关注(0)|答案(2)|浏览(380)

我尝试使用new Promise(resolve =〉...)来承诺(或利用async await特性)函数getId中的回调,但是由于使用了更高阶的函数getAddresses,我有点不知所措。我不擅长函数式编程。关于如何承诺这个函数,有什么建议吗?

const {queryRecord, getData} = require(“@xyzLib”);

const getId = (callback) => {
    getData(“attr1”,”attr2”,getAddresses(callback));
}

const getAddresses = (callback) => (result) => {
    if (!result.success) {
      callback(new Error(‘Exception details’))
    } else {
      queryRecord(objectName, (result) => {
        callback(null, result.name);
    });
   }
}
// invoking call

getId(async (error, zip, state) => {
if (error) {
    console.log(error.message)
} else {
 await fetch(encodeURI(settingsUrl), {
    method: 'GET',
});
....
46qrfjad

46qrfjad1#

由于getId()接受一个回调作为最后一个参数,并且该回调使用nodejs调用约定,因此可以直接在getId上使用util.promisify(),如下所示:

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

const getIdPromise = promisify(getId);

getIdPromise().then(result => {
    console.log(result);
    let fetchResult = await fetch(...);
    ...
}).catch(err => {
    console.log(err);
});

或者,如果您已经在async函式主体中:

try {
    const result = await getIdPromise();
    console.log(result);
    const fetchResult = await fetch(...);
    ...
} catch (err) {
    console.log(err);
}
mnemlml8

mnemlml82#

你应该在最低的可用级别上进行承诺,也就是说,从库中导入的函数。这样你就不需要这样的承诺了。

const { promisify } = require('util');
const xyz = require(“@xyzLib”);
const queryRecord = promisify(xyz.queryRecord);
const getData = promisify(xyz.getData);

你可以简单地写

async function getId() {
    return getAddresses(await getData("attr1", "attr2"));
}

async function getAddresses(data) {
  if (!data.success) throw new Error("Exception details");
  const result = await queryRecord(objectName);
  return result.name;
}

// invoking call
try {
  const zip = getId();
  await fetch(encodeURI(settingsUrl), {
    method: 'GET',
  });
} catch(error) {
  console.log(error.message);
}

相关问题