NodeJSでGoogle Cloudサービスを使用する場合は、バケット(ストレージ内)などのリソースにアクセスする必要があり、初めて呼び出すときには存在しているかどうかを確認する必要があります。ノードオブジェクト内にオブジェクトをインスタンス化する際のスタンプを防止
まあ、複数のリソースがアプリケーションの開始時に同じバケットにアクセスすると、それらは同時に作成しようとします。私はこのようなものを使用する必要が殺到防ぐため
:
getStorage(id) {
return new Promise((resolve, reject) => {
// Exists storage?
if(id in this.storage) {
let storage = this.storage[id];
// Storage is ready, deliver
if(storage.ready) {
return resolve(storage);
}
// Not ready, wait until storage is ready
let wait;
let start = +Date.now();
wait = setInterval(() => {
// Storage is now ready
if(storage.ready) {
clearInterval(wait);
return resolve(storage);
}
// Timeout in 15 seconds
if(+Date.now() - start > 15*1000) {
clearInterval(wait);
return reject(new Error('timeout while waiting storage creation'));
}
}, 10);
return;
}
// Start storage creation
let storage = new Storage(id);
this.storage[id] = storage;
storage
.create()
.then(resolve, reject);
});
}
は、アンダースコアまたはこのシナリオで役立ちます非同期、lodashで何かですか?インスタンススタンピングのシナリオ。
セマフォが便利ですか? lodashで
getStorage(id) {
return new Promise((resolve, reject) => {
// already found
if(id in this.storage) {
resolve(this.storage[id]);
return;
}
// prevent stampede
// async.stampede(UNIQUE_ID, CREATE, RESULT)
// - CREATE will be called once for UNIQUE_ID
async.stampede(id, (end) => {
let storage = new Storage(id);
storage
.create()
.then(
() => end(null, storage),
(err) => end(err)
);
}, (err, result) => {
if(err) reject(err);
else {
this.storage[id] = storage;
resolve(result);
}
});
});
}
が、それは「一度」が、との約束のようなものになります
非同期スタイルでは、このようなものである可能性があります。
この 'async'はあなたが参照しているものではありません、私は' stampede'メソッドを見つけることができませんか? – Bergi
@Bergiは存在しません、私はスタンプのための非同期メソッドがどのようにできるか想像しようとしていました。私はその質問で、申し訳ありませんを明確にするつもりです! – Wiliam