簡體   English   中英

返回 Promise 結果而不是 Nodejs 中的 Promise

[英]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));

問題

正如你所看到的,我有點困惑。

  1. 鑒於getInfo()實際上是異步的,是否可以實現與我的第二個代碼示例中的代碼類似的代碼?
  2. 如果可能的話,這是個好主意嗎? 你會怎么做?

您只能從某個函數返回一個值,如果該值在調用該函數時立即可用(在事件循環的同一滴答上)。 請記住, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM