在Nodejs中返回Promise结果而不是Promise
背景
我正在努力学习承诺,并且我有一个我想要改进的承诺链。
问题
在学习如何链接承诺的同时,我不明白为什么有人愿意回报承诺而不是回报它的价值。
以下面的示例使用promise链:
let myObj = new MyClass();
myObj.getInfo()
.then(result => writeOutput(FILE_NAME, result))
.then(console.log(FILE_NAME + " complete"))
.catch(error => console.error(error));
class MyClass{
getInfo() {
return new Promise(function(fulfil, reject) {
fulfill("I like bananas");
});
}
在这里我必须连锁2次。 但是,如果我直接从方法getInfo()
返回结果而不是返回Promise,那么我可能会执行如下操作:
let myObj = new MyClass();
let str = myObj.getInfo();
writeOutput(FILE_NAME, str)
.then(console.log(FILE_NAME + " complete"))
.catch(error => console.error(error));
问题
所以你可以看到我有点困惑。
getInfo()
实际上是异步的,是否可以实现类似于我的第二个代码示例中的代码的代码? 只有当该函数被调用时(在事件循环的相同记号上)该值立即可用时,才能从某个函数返回一个值。 请记住, return
是同步的。
如果它没有立即可用,那么你只能返回一个承诺(或者你可以使用回调,但在这里你是专门询问承诺)。
有关更详细的解释,请参阅我之前写过的关于如何从某个函数返回AJAX调用结果的问题。 我解释了为什么你不能返回价值,但你可以返回一个承诺:
这是另一个相关的答案 - 由于某种原因它被降低了,但我认为它解释了一个类似的问题,你问她:
我不明白为什么有人愿意回报承诺,而不是回报它的价值。
因为你还没有价值。
鉴于getInfo()
实际上是异步的,是否可以实现类似于我的第二个代码示例中的代码的代码?
如果它是异步的,它必须返回一个承诺。
避免then
调用(但仍然使用并产生承诺)的语法可以通过async
/ await
:
async function writeInfo(FILE_NAME) {
const myObj = new MyClass();
try {
const str = await myObj.getInfo();
await writeOutput(FILE_NAME, str);
console.log(FILE_NAME + " complete");
} catch (error) {
console.error(error);
}
}
writeInfo("…");
承诺的目的是说:“数据将在某个时间出现,只需继续进行编码”,以便您的页面不会被卡住。 基本上你使用Promises来例如从服务器加载一些东西。
链接地址: http://www.djcxy.com/p/55351.html