![](/img/trans.png)
[英]Javascript resolve first element in array of promises that has been fullfilled in order
[英]Why resolve parameter comes first in JavaScript Promises?
我正在學習 javascript Promises。 在我看來,JavaScript Promise
工作方式類似於callback
函數。
在callback
函數中,我們通常使用第一個參數作為error
,第二個作為success
。
那么為什么在 JavaScript Promise
,參數的出現方式不同呢? 首先是success
,其次是error
? 這就像callback
參數結構的相反,它讓我感到困惑。
這不是問題,但我想對此做出解釋。 如果我錯了,那我錯過了什么?
您顯然是在談論 Promise 執行器函數(您傳遞給new Promise(...)
)。 這只是一種完全不同類型的回調,它與標准的 node.js 異步回調實際上沒有任何共同之處。
promise executor 函數向您傳遞了兩個獨立的函數,您可以稍后調用它們。 兩者都不是錯誤。 當您確實遇到錯誤時,您會調用reject(err)
並將錯誤作為第一個參數傳遞給它。
傳遞兩件事的另一個地方是.then()
處理程序,您可以在其中傳遞解析處理程序和拒絕處理程序。 同樣,這是完全不同的事情。 您正在向它傳遞兩個函數引用,promise 基礎結構將決定傳遞哪個回調。 當它調用這些回調時,它會將參數作為第一個參數傳遞。
以下是 Promise 中兩個不同的回調元素:
// promise executor function
let p = new Promise((resolve, reject) => {
// this is passing to your callback two function references.
// there's no error at this point.
// you decide which function to call in your asynchronous operation
});
// then handler
somePromise.then(resolveData => {
// this callback gets called when your promise resolves
// it is known there is no error here, so no need to pass an err parameter
}, rejectErr => {
// this callback gets called when your promise is rejected
// the error is passed as the first argument
// this callback is optional
});
還有.catch()
和.finally()
處理程序,但它們的工作方式與單個回調類似。
請記住,該模式:
p.then(successHandler, errorHandler)
沒有將錯誤作為第二個參數傳遞給您。 您正在向它傳遞兩個函數引用,稍后它將調用其中一個。 通過這種方式,它不像fs.readFile()
會使用的標准 nodejs 異步回調。 它有一個完全不同的目的和不同的工作方式。
您將 JavaScript 承諾回調與來自 Node 標准庫 API 的回調設計模式混淆了。 她們不一樣。
JavaScript promises 的目的是處理長時間運行的進程,我們需要一些能力來確定進程何時完成以繼續運行下一段代碼。
因此,在您正在了解的 Promises 回調中,有 3 種狀態: unresolved 、 resolution和denied 。
默認情況下,Promise 存在於未解析狀態,這意味着您剛剛創建了 Promise 並且您正在等待某些事情發生,一些長時間運行的進程(例如 Ajax 請求或其他事件)發生,一旦發生,Promises 進入進入其他兩個狀態之一,解決或拒絕。
以上不是 Node 標准庫回調的目的和功能,它們在作為文件系統 API 一部分的函數內部使用。 這些特定的函數,例如read()
、 readdir()
等,有三個可以傳遞給它的參數,一個是可選的,第三個是您所說的回調。
使用文件系統函數時,Node 標准庫回調的模式是在該回調參數中提供兩個參數,第一個始終是錯誤對象err
,現在不能保證會發生錯誤,而是如果出現問題當打開一些文件時,Node 將使用err
對象的第一個參數調用回調。
如果沒有錯誤,則第一個參數將為空。
現在回調函數的第二個參數將是我實際要查找的數據。
https://nodejs.org/api/fs.html#fs_file_system
你看,你在談論兩種不同的回調。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.