簡體   English   中英

Promise((resolve,reject)=> {})和Promise(resolve => {})有什么區別?

[英]What is the difference between Promise((resolve,reject)=>{}) and Promise(resolve =>{})?

我們知道Promise構造函數有一個執行函數,它有兩個參數,用於生成成功案例或失敗案例。 今天我正在編程而且我被困住但后來我解決了這個問題,但我發現有一件事需要被理解。

有什么區別

new Promise(resolve => {

    // resolve

});

new Promise((resolve,reject)=>{

    // resolve
    // reject

});

我們可以這樣做嗎?

new Promise(resolve => {

    // resolve

}, reject => {

    // reject

});

將更加贊賞示例。 謝謝 !!!

這不是Promises特有的,只是回調函數。

new Promise((resolve) => {}); 1創建一個Promise,其回調只接受resolve參數。 無法調用否則將提供的拒絕功能。 2

new Promise((resolve, reject) => {}); 創建一個Promise,其回調接受兩個參數,包括拒絕參數。

以上兩個示例演示了位置參數的工作原理。 回調函數中的第一個參數始終是resolve函數,第二個參數始終是reject函數。

new Promise((reject, resolve) => {}); 將創建一個Promise,您可以在其中解決reject並拒絕resolve

您可以throw回調函數的范圍或resolve(Promise.reject())以導致拒絕發生:

new Promise((resolve) => {
  throw new Error("42");
  // or `resolve(Promise.reject(new Error("42")));`
})
  .catch(console.warn); // Prints warning “Error: "42"” in the console.

你不能使用new Promise((resolve) => {}, (reject) => {}); ,因為Promise構造函數只接受一個參數。 第二個回調函數將被忽略。


1(resolve) => {}當然等同於resolve => {} 但箭頭函數參數實際上總是需要括號。 簡單和單個參數是可以省略的唯一例外 請參閱有關箭頭函數語法MDN文章

2 :使用常規函數, new Promise(function(resolve){}); new Promise(function(){}); 你可以使用 arguments[0]解析 )或arguments[1]拒絕訪問任何參數

如果你知道承諾永遠不會失敗的事實,你可以省略reject ,例如計時器。 任何需要錯誤處理程序(http請求,文件i / o等)的東西都需要reject回調。

您傳遞的箭頭功能是異步操作結束時觸發的回調。 它接受2個參數,在成功時調用的函數,(解析)和在失敗(拒絕)的情況下調用的函數。

在JS中,您不必將所有參數傳遞給函數回調。 如果你不打算處理錯誤(你應該處理!),你可以省略它。

如果你傳遞1個參數,則認為它是一個解析fn。

好吧,忘記了promises,如果任何帶有一個參數的函數被兩個參數調用,那么作為par JavaScript標准就沒有問題(反之亦然)。

現在,與您的承諾相關,您傳遞給構造函數的回調將被2個參數(解析器函數和拒絕器)調用。 如果你創建具有1個參數的函數並將其傳遞給Promise的構造函數,那么它只會被2個參數調用,因為你沒有引用第二個參數,你不能以它應該是用戶的方式使用它(作為通用語句)而不是承諾)。

如果你仍然需要第二個參數,你仍然可以嘗試使用arguments但是,使用arrow功能你也不會得到它。 在這種情況下,最好使用普通function () {} 否則,您可以嘗試使用Promise.resolvePromise.reject顯式返回另一個promise

而且肯定最后一個帶有多個回調作為Promise構造函數的參數是不行的,因為它的設計就像有一個帶2參數的回調。

暫無
暫無

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

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