簡體   English   中英

在 Node.js 中嵌套承諾的情況下承諾解決/拒絕

[英]Promise resolve/reject in case of nested promise in Node.js

如果在父承諾中調用的承諾引發錯誤,我們應該捕獲錯誤還是會自動捕獲錯誤?

例子:

function p1(val)
{
    return new Promise((resolve, reject) => {

        //do something with val
        if(val == true)
           reject(err);

        p2()
        .then(result => resolve(result)
        .catch(reject); //is this line necessary?
    });
}

function p2()
{
    return new Promise((resolve, reject) => {
        //resolve or reject...
    });
}

使用修改后的代碼,您在調用p2之前所做的工作,您有幾個選擇。 如果您對 functino 的初始同步部分中的錯誤是同步錯誤而不是承諾拒絕感到高興,您可以這樣做:

function p1(val) {
    //do something with val
    if (val == true)
        throw err;

    return p2();
}

第一部分是同步發生的,然后從p2返回承諾。 你是否這樣做部分取決於函數正在做什么,部分取決於樣式。 如果初始同步部分正在設置異步操作,並且您希望函數在設置異步進程出現問題時拋出(而不是返回被拒絕的承諾)(然后根據異步進程是否工作完成/拒絕) ),你可以這樣做。

如果您希望函數始終通過承諾報告成功/失敗,那么如果您正在進行初始工作,您確實需要自己的承諾:

function p1(val) {
    return new Promise((resolve, reject) => {
        //do something with val
        if(val == true)
           reject(err);

        resolve(p2());
    });
}

resolve(p2())部分將創建的承諾p1解析為來自p2的承諾:如果p2的承諾拒絕,則p1的承諾以p2拒絕原因拒絕; 如果p2的承諾履行, p1的承諾履行與p2履行價值。

或者您可以使用async函數,它具有相同的結果:

async function p1(val) {
    //do something with val
    if(val == true)
        throw err;

    return p2();
}

在這兩種情況下,這確保了p2之前的初始代碼拋出的任何錯誤都會導致拒絕而不是同步錯誤,即使初始代碼不涉及異步處理。

要記住的主要事情是,當您已經有一個承諾(例如來自p2的承諾)時,沒有必要使用new Promise 相反,只需將您已有的承諾聯系起來即可。 更多信息在這里。)但是當你在得到承諾之前做一些事情時,就像在你修改后的例子中一樣,你可以根據你是希望函數錯誤的第一部分是同步的還是承諾拒絕來創建自己的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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