簡體   English   中英

這些參數是否“擴展”在 Promise 中解析和拒絕?

[英]Are these parameters “extended” resolve and reject in Promise?

我正在重用在 Github 上找到的一些代碼,我想出了一些我不確定它是什么的代碼。 這是整個代碼;

const checkifRightPw = (ctx, next) => {
return new Promise((resolve, reject) => {
        users.getUserByEmail(ctx.params.user_email).then((users) => {
            if (users.length > 0) {
                resolve(users);
            } else {
                reject('email doesnt exist');
            }
        });
    }).then(
        (data, err) => (ctx.body = data),
        (err) => {
            ctx.response.status = 404;
            ctx.body = err;
        }
    );
}

我想知道這些代碼行:

(data, err) => (ctx.body = data),
   (err) => {
   ctx.response.status = 404;
   ctx.body = err;
}

dataerr在這里代表解決和拒絕嗎? 通常在承諾中會有一個 function 調用之后。所以我對這里的這種情況有點困惑。

好的,讓我們看看這個:

.then(
        (data, err) => (ctx.body = data),
        (err) => {
            ctx.response.status = 404;
            ctx.body = err;
        }
 );
  1. 它將兩個胖箭頭函數傳遞給.then() 第一個是 function 如果 promise 得到解決,則調用,第二個是 function 如果被拒絕,則調用。 從邏輯上講,它的結構是.then(resolveCalback, rejectCallback)
  2. 第一個粗箭頭 function 有兩個 arguments, (data, err) 那是錯誤的。 對於任何標准的 promise 實現,只有一個參數傳遞給.then()處理程序。 幸運的是,該實現不使用第二個參數,該參數無論如何總是undefined的。
  3. 第一個粗箭頭 function 只是將解析值從data移動到ctx.body 顯然,返回此 promise 的 function 的調用者將在ctx.body中查找已解析的值。
  4. 第二個粗箭頭 function 也在設置帶有狀態和錯誤值的ctx object。 而且,重要的是,它不會重新拋出或返回被拒絕的 promise。 因此,它將 promise 從拒絕更改為已解決。 因此,調用者只會從這個 function 中得到一個已解析的 promise 並且顯然必須檢查ctx.response.status以了解是否存在錯誤。

如果粗箭頭函數讓您感到困惑,那么這段代碼可以使用常規函數表示如下:

.then(function(data) {
    ctx.body = data;
    return data;
}, function(err) {
    ctx.response.status = 404;
    ctx.body = err;
});

data 和 err 在這里代表解決和拒絕嗎?

不。見我上面的第二點。 只有data是有效的,它包含 promise 的解析值。 err作為第一個回撥的參數是一個編程錯誤。 它沒有通過那里。 拒絕回調是第二個回調 function。

通常在承諾中會有一個 function 調用之后。所以我對這里的這種情況有點困惑。

這些是粗箭頭函數(不同類型的 function 聲明)。 因此,有兩個函數被傳遞給 like .then(fn1, fn2) 您可以在 MDNSitePoint上閱讀有關胖箭頭功能的信息。 它們的主要目的是一種快捷語法和對 function 中this值的不同處理。 在這種情況下,程序員可能將它們用於較短的語法,因為沒有對this的引用。

暫無
暫無

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

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