串流星:使用同步函式庫 - 包裝Async和繫結環境

*#Whats流星.包裝Async和流星.綁定環境?

在第 1 部分中,我們看到了 Meteor 如何使用光纖抽象異步代碼,並提供了一種以同步樣式編寫 JS 的簡單方法。在第 2 部分中,我們瞭解如何使用純非同步庫

使用光纖,我們可以修改非同步函數,編寫同步代碼。但是,如果無法像第三方庫那樣修改函數,會發生什麼情況?

在 ShareThis ,我們的 Meteor 應用程式使用亞馬遜的 S3 作為緩存和數據存儲層。從 Amazon S3 文件中,要加入 S3 儲存桶的 JavaScript 方法簽名看起來像

"'

獲取物件(參數={},回調)⇒AWS。請求

//This is how the function would look in Meteor server code

    S3.把物件({

    桶: ' sharethis -洞察商店',

    鍵:鍵,

    正文 : 資料

    },函數(錯誤,結果){

    如果(結果){

      控制台.log("完成");

      //optionally pass in callback

    }

    });

"'

上述代碼將不能按預期工作,因為對 S3.putObject 的回調未綁定到當前光纖

在此用例中,我們使用 Meteor.wrapAsync 並將非同步函數包裝到當前光纖中

*#What流星.wrapAsync嗎?

Meteor.wrapAsync 採用您給它作為第一個參數的方法,並在當前光纖中運行它。

它還附加回調(它假定使用回調的傳統節點樣式,即該方法將回調作為其最終參數,其中兩個參數(錯誤和結果)將基於調用結果為空

回調與 Meteor.bind 環境綁定,並阻止當前光纖,直到觸發回調。一旦回調觸發,它返回結果或引發錯誤。

"'javascript

功能同步中繼( 單位 )

傳回流星.wrapAsync(非同步功能)

}

"'

[如何使用 Meteor 傳回的同步包裝函數存取錯誤物件?

一種方法使用 try/catch 塊,因為在出現錯誤的情況下,同步函數將引發它,而不是作為非同步函數回檔的第一個參數傳遞。

"'

嘗試{

var 結果=同步Func(參數);

控制台.log("成功",結果);

}

擷取 (錯誤)?

控制台.log("錯誤:",錯誤);

}

// which is equivalent to –

非同步功能 (參數、函數(錯誤、結果)?

如果(錯誤)

    控制台.log("錯誤",錯誤);

    控制台.log("結果",結果);

});

"'

這非常適合將異步代碼轉換為同步代碼,因為您可以在下一行上使用方法的結果,而不是使用回調和/或嵌套更深的函數。它甚至負責為您綁定回調到當前光纖(使用 Meteor.bind 環境)。

最後一條需要注意的是,如果您希望對非同步庫函數的回調執行更多操作(只是因為),您必須顯式使用 Meteor.bind 環境,否則您會收到一個錯誤,指出 Meteor 代碼必須始終在光纖中運行。

"'

瓦爾芬奇=函數(cb){

    S3.put物件(參數、串流星.結合環境(函數(錯誤、資料)

      如果(錯誤){

       拋出新的流星錯誤("S3上的存儲失敗");

      }其他{

        控制台.log("在 S3 上成功存儲數據");

          cb(空,數據);

    }

    }));

 };

返回(Meteor.wrapAsync(func)();

"'

很少哥查,你需要意識到,當使用流星.

它旨在使用純異步函數,這些函數期望回調時出現錯誤,結果為參數。此外,它們僅在伺服器端工作(因為您不能在用戶端使用光纖)

伺服器端方法(如 Meteor.HTTP.call)已經以這種方式包裝。如果調用它時沒有回調,則該方法將阻塞,直到收到回應。否則,它將立即返回,然後在收到網路回應後執行回調。

關於作者
ShareThis

ShareThis 自 2007 年以來,通過綜合社會共用、興趣和意圖數據,解鎖了全球數位行為的力量。受全球超過300萬個功能變數名稱的消費者行為推動, ShareThis 觀察真實人員在真實數位目的地上的即時操作。

關於我們

ShareThis 自 2007 年以來,通過綜合社會共用、興趣和意圖數據,解鎖了全球數位行為的力量。受全球超過300萬個功能變數名稱的消費者行為推動, ShareThis 觀察真實人員在真實數位目的地上的即時操作。