串流星:使用同步函式庫 - 包裝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)已經以這種方式包裝。如果調用它時沒有回調,則該方法將阻塞,直到收到回應。否則,它將立即返回,然後在收到網路回應後執行回調。