簡體   English   中英

打字稿空回調函數

[英]Typescript empty callback function

在我的 angular 項目中,我有一個方法需要兩個回調函數,一個用於成功,一個用於失敗,目前看起來像:

somefunction(function(token) {
    console.log('Got token: ' + token);
  }, function(error) {
    console.log('Failed to get token', error);
});

假設我想保留錯誤處理但我對成功回調不感興趣,仍然處理錯誤回調的正確方法是什么? 我應該創建一個空的成功方法,如:

somefunction(function(token) {
  }, function(error) {
    console.log('Failed to get token', error);
});

我應該給 null 作為第一個參數嗎?

somefunction(null, function(error) {
    console.log('Failed to get token', error);
});

我不確定使用 null 是否有任何危險,我應該添加一個空函數(看起來多余)。\\

編輯:該功能來自庫,我寧願不接觸庫。

我將嘗試對我的評論進行更深入的解釋。 你正在做的事情接縫是一個老派的 JavaScript 編碼類型的編碼 TypeScript 被發明來防止。 在 JavaScript 中,您有兩種類型的“空”值,它們相似但不相同的 null 和 undefined。 有一段時間,在 TypeScript 中,默認情況下所有值都是非 nulluble,這意味着與 JavaScript 不同,如果您嘗試將 null 或 undefined 放入函數中,您將收到編譯器錯誤。 所以如果你的 somefunction 看起來像這樣。

function someFunction(success: (token: string) => void, error: (error:string) => void) {

}

somefunction(null, (e) =>{})這樣的調用somefunction(null, (e) =>{})不會編譯,因為默認情況下所有內容都不可為空。 並且你必須給它一個像somefunction(()=>{}, () =>{})這樣的空回調somefunction(()=>{}, () =>{})你可以看到你不需要令牌參數,因為任何 paraatreless 函數都可以轉換為參數函數。 如果某個函數的創建者在類型腳本中允許“null”,他會像這樣定義

function someFunction(success?: (token: string) => void, error?: (error:string) => void) {

}

在哪里? 是一種更短的寫法 () => void | 不明確的。 現在你可以用someFunction(undefined, ()=>{});調用它someFunction(undefined, ()=>{}); 但是調用someFunction(null, ()=>{}); 將產生錯誤,因為 null 不等於 (===) 未定義。 這是在 TypeScript 中允許空調用函數的最常見方法。 如果你真的想要一個空值,你可以像這樣定義一些函數

function someFunction(success: ((token: string) => void) | null, error: ((error:string) => void) | null) {

    }

如果大多數人使用,這在打字稿和方式二中確實不常見。 但是由於您從我所看到的您正在做的事情中詢問“最佳實踐”是一些異步工作流程,現代 JavaScript 和打字稿傾向於更喜歡 Promises 和 angular Observables(兩者並不相互排斥並且可以很好地協同工作)。

如果你更喜歡使用更多 ES6 的方式,你可以把這個函數包裝到一個 Promise 中。 這將允許您使用的功能thencatch上這個功能。

一個簡單的方法是創建一個新的Promise並將resolvereject作為參數傳遞給函數。

let myPromise = new Promise((resolve, reject) => {
    somefunction((item) => { resolve(item) }, (error) => { reject(error) });
   // or even somefunction(resolve, reject);
});

然后,您可以將此承諾用作任何其他承諾。 在你的情況下;

myPromise.catch((error) => {
    console.error(error);
});

這對於您正在嘗試做的事情來說意義重大,但是您可以將其包裝到一個函數中,並在需要使用庫函數的任何地方使用它。

function toPromise(fnc) {
    return new Promise((resolve, reject)  => fnc(resolve, reject));
}

toPromise(somefunction).catch((error) => {
   //handle the error
});

在這里我只使用了箭頭函數,但如果你願意,你可以使用普通的回調函數。

暫無
暫無

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

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