[英]Return Promise result instead of Promise in 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()
實際上是異步的,是否可以實現與我的第二個代碼示例中的代碼類似的代碼?
如果它是異步的,它必須返回一個承諾。
async
/ await
使避免then
調用(但仍使用並產生 promise)的語法成為可能:
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 來從服務器加載一些東西。
看待第一個問題的另一種方式(“為什么會有人......”):
當您打電話.then
或.catch
中承諾,從調用返回掛起的承諾被添加到現有的承諾鏈的末端。 (允許“現有鏈”可能只包含一個承諾)。
當你解決(不是“履行”,你不能用承諾履行承諾)一個承諾時,決議中使用的承諾被插入到承諾鏈的剩余部分的頭部。
在決議中使用的承諾必須與價值實現的下一個之前.then
或.catch
鏈中的條款被調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.