[英]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;
}
data和err在這里代表解決和拒絕嗎? 通常在承諾中會有一個 function 調用之后。所以我對這里的這種情況有點困惑。
好的,讓我們看看這個:
.then(
(data, err) => (ctx.body = data),
(err) => {
ctx.response.status = 404;
ctx.body = err;
}
);
.then()
。 第一個是 function 如果 promise 得到解決,則調用,第二個是 function 如果被拒絕,則調用。 從邏輯上講,它的結構是.then(resolveCalback, rejectCallback)
。(data, err)
。 那是錯誤的。 對於任何標准的 promise 實現,只有一個參數傳遞給.then()
處理程序。 幸運的是,該實現不使用第二個參數,該參數無論如何總是undefined
的。data
移動到ctx.body
。 顯然,返回此 promise 的 function 的調用者將在ctx.body
中查找已解析的值。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)
。 您可以在 MDN和SitePoint上閱讀有關胖箭頭功能的信息。 它們的主要目的是一種快捷語法和對 function 中this
值的不同處理。 在這種情況下,程序員可能將它們用於較短的語法,因為沒有對this
的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.