功能内的承诺



此代码不执行testAuthentication或pinFileToIPFS的承诺,我很好奇这是否是我不熟悉的节点概念。

function uploadToPinata(filename) {
const pinata = pinataSDK(process.env.PINATA_KEY, process.env.PINATA_SECRET_KEY);
pinata.testAuthentication().then((result) => {
//handle successful authentication here
console.log(result);
}).catch((err) => {
//handle error here
console.log(err);
});

const readableStreamForFile = fs.createReadStream(filename);
const options = {
pinataMetadata: {
name: "NYC_NFT_TESTING",
},
pinataOptions: {
cidVersion: 0
}
};
pinata.pinFileToIPFS(readableStreamForFile, options).then((result) => {
//handle results here
console.log(result);
}).catch((err) => {
//handle error here
console.log(err);
});
}

在函数中使用promise的代码有问题吗?我试图使函数异步,但这没有帮助。这段代码在函数外工作得很好,但在函数内则不然。

"不履行承诺">:这是一个奇怪的短语。承诺就是对象。它们不是执行——它们是创建的。你的功能真的创造了它们。然而,当这些承诺得到解决时,它并没有起到多大作用。

问题是uploadToPinata将执行所有同步代码并返回。但是,仍然有一些承诺悬而未决。尽管您有console.log,一旦相关承诺得到解决,就会执行它,但uploadToPinata的调用方不会收到这些承诺已经得到解决的信号。

使用asyncawait:可能最简单

async function uploadToPinata(filename) {
const pinata = pinataSDK(process.env.PINATA_KEY, process.env.PINATA_SECRET_KEY);
const result = await pinata.testAuthentication();
//handle successful authentication here
console.log("authentication result", result);
const readableStreamForFile = fs.createReadStream(filename);
const options = {
pinataMetadata: { name: "NYC_NFT_TESTING" },
pinataOptions: { cidVersion: 0 }
};
const result2 = await pinata.pinFileToIPFS(readableStreamForFile, options);
//handle results here
console.log("pinFileToIPFS result", result2);
}

这个函数的调用方现在将收到一个promise,所以它可能想在该promise解决后做一些事情:

uploadToPinata(filename).then(() => {
console.log("authentication and file operation done")
}).catch(error => console.log("error", error));

最新更新