2016-07-07 4 views
-2

私は約束事に包まれた一連の操作を保存した状況があります。ここで、リクエストがAPIにヒットするたびに、この操作が実行されます。bluebirdで充実した約束を果たさない方法

のは、私が実行しているサービスのステータスを取得するための操作の束を作成したとしましょう:要求は、それが状況をフェッチし、それをものに履行値を設定し、1回目のためのAPIハンドラをヒットすると

const jobs = []; 

function statusRequest (url) { 
    return new Promise((resolve, reject) { 
    request(url, function(error, resp, body) { 
     if (error) { 
     return reject(error); 
     } 
     resolve(body); 
    }); 
    }); 
} 

services.forEach(url => { 
    jobs.push(statusRequest(url)); 
}); 

function handler (request, reply) { 
    Promise.all(jobs).then(results => { 
    // handle results 
    }) 
    .catch(error => reply(error).code(500)) 
} 

module.exports = { 
'auth'  : false, 
'description' : 'Get the status of all the services', 
'tags'  : [ 'api', 'system', 'status' ], 

    handler 
}; 

を結果(キャッシュされた)。 APIへの後続のリクエストには、最初のフルフィルメント値が返されます。

約束事を満たされていない状態にリセットする方法はありますか?各呼び出しはすでに作成された操作を実行するだけですか?

+1

1.いいえ、それは明らかなXYの問題です:あなたがしようとしていることを説明して、それをやろうとするのではなく、あなたが望むことができないコードを見せてください。 – Amit

+0

あなたがDDDから聞いたことを英語に翻訳します。 「私は何かが起こることを望むたびに仕事をしたくないが、そのことが起こることを望む」オペレーションは、実行されている作業のメタファです。 「約束」の成就は、その作品の「完成」です。 – Aron

+0

技術的には可能ですが(JSでは何でも可能です)。可能な限り最悪の考えです。それは論理的、文法的または意匠的な意味を持たないからです。次の開発者があなたのコードを操作することを約束します。「彼はあなたを探し、彼はあなたを見つけ、彼はあなたを殺します。 – Aron

答えて

-1

だけの操作を実行します満たされていないので、各コールに約束すでに作成をリセットする方法はありますか?

いいえ、できません。

既存の約束の結果にアクセスするには、それを実行する必要はありません(これは何もできません)。新しい.then()ハンドラを追加することができます。

オリジナルの約束をキャッシュして、新しい.then()ハンドラを使用するように思えます。これにより、以前の結果が返されます。これは、非同期結果のキャッシュを行う簡単な方法です。

var doSomeAPICall = (function() { 
    var cachedPromise; 

    return function() { 
     if (!cachedPromise) { 
      cachedPromise = doSomeAsyncOperation(); 
     } 
     return cachedPromise; 
    } 
})(); 

そして、使用例:

doSomeAPICall().then(function(data) { 
    // process data here 
}); 

// the second time, it will be using a cached result 
doSomeAPICall().then(function(data) { 
    // process data here 
}); 

あなたはいつもそれが持っているか、すでに持っています、結果へのアクセスを取得するために、既存の約束に多くの.then()ハンドラを追加することができ、覚えておいてください。


参考までに、約束を破棄することはできません。約束は、意図的にワンショットのデバイスであり、一度満たされるか拒否されると状態を保持します。新しい.then()ハンドラを追加して約束の結果にアクセスしたり、新しい非同期操作を実行する場合は新しい約束を作成することができます。既存の約束を再利用して別の非同期操作を実行することはありません。彼らはそれを防ぐために明示的に設計されています。


これはあなたがやろうとしているものでない場合は、あなたの質問を明確にしてくださいいくつかは、より多くのように、我々はあなたが達成しようとしているものをより明確に理解することができます。

+0

なぜdownvote?これは、OPが達成しようとしていることに答えるようです。 – jfriend00

+0

@James - これはあなたの質問に答えるのに役立ちますか? – jfriend00

関連する問題