私はAとBという2つの約束を持っていますが、そのうちの1つだけが成功するでしょう。私はPromise.race
に似た何かを探していますが、それは実現する最初の約束しか返しません。私はES6からの約束を使用しています。最初に約束を達成
Q
最初に約束を達成
5
A
答えて
10
それが反転した後、最初の成就の約束に対応する第1の拒否約束、上拒否しているため、約束の極性を反転し、次にあなたがPromise.all
を使用することができます。
const invert = p => new Promise((res, rej) => p.then(rej, res));
const firstOf = ps => invert(Promise.all(ps.map(invert)));
// Utility routines used only in testing.
const wait = ms => new Promise(res => setTimeout(() => res(ms), ms));
const fail = f => Promise.reject(f);
const log = p => p.then(v => console.log("pass", v), v => console.log("fail", v));
// Test.
log(firstOf([wait(1000), wait(500) ]));
log(firstOf([wait(1000), fail("f1")]));
log(firstOf([fail("f1"), fail("f2")]));
これは、最初に実行された約束の値を返します。すべてが拒否された場合は、拒否理由の配列を返します。
3
あなたが成功し解決する最初の約束をしたいとあなたがその前に来るすべての拒否を無視したい場合は、このようなものを使用することができます
// returns the result from the first promise that resolves
// or rejects if all the promises reject - then return array of rejected errors
function firstPromiseResolve(array) {
return new Promise(function(resolve, reject) {
if (!array || !array.length) {
return reject(new Error("array passed to firstPromiseResolve() cannot be empty"));
}
var errors = new Array(array.length);
var errorCntr = 0;
array.forEach(function (p, index) {
// when a promise resolves
Promise.resolve(p).then(function(val) {
// only first one to call resolve will actually do anything
resolve(val);
}, function(err) {
errors[index] = err;
++errorCntr;
// if all promises have rejected, then reject
if (errorCntr === array.length) {
reject(errors);
}
});
});
});
}
を私はあなたがどのように使用できるかが表示されないPromise.race()
なぜなら、それは単に最初の約束を報告するだけであり、最初の約束が拒否されれば拒絶を報告するからです。それで、それはあなたがあなたの質問で尋ねたことをやっていません。それは解決する最初の約束を報告することです(たとえそれ以前に拒絶が終わったとしても)。
FYI the Bluebird promise libraryには、このケースを処理できるPromise.some()
とPromise.any()
の両方があります。
0
//example 1
var promise_A = new Promise(function(resolve, reject) {
// выполнить что-то, возможно, асинхронно…
setTimeout(function(){
return resolve(10);
//return reject(new Error('ошибка'))
},10000)
});
var promise_B = new Promise(function(resolve, reject) {
// выполнить что-то, возможно, асинхронно…
setTimeout(function(){
return resolve(100);
},2000)
});
/*
//[100,10]
Promise.all([
promise_A,promise_B
]).then(function(results){
console.log(results)
});
*/
//100
Promise.race([
promise_A,promise_B
]).then(function(results){
console.log(results)
});
+0
達成する約束。 – mbacvanski
関連する問題
- 1. Qで約束の配列を達成
- 2. 最初に失敗した場合に2番目の約束結果を返す約束
- 3. PG-約束:空の約束
- 4. 約束を動的に作成する
- 5. 約束が成立した後に約束を返す実行関数
- 6. 非同期/約束を約束する
- 7. 約束の中で約束を返す
- 8. 角度サービスの約束は最初に定義されていません
- 9. 約束は、約束の前リターンは、
- 10. Javascript約束しない約束
- 11. 返信済み約束約束
- 12. 約束
- 13. 約束
- 14. 最後の約束の句はジャスミンテスト
- 15. ループ内で約束を作成
- 16. $ qと約束を約束通りに解決する
- 17. シノンどのように約束を約束する?
- 18. iOS(ObjC)PromiseKit - 約束内に約束を返す
- 19. は空約束に
- 20. ネストされた約束を順番に実行し、最初の拒否時に解決することを約束します
- 21. イオンアプリの約束は最初のビューでのみ機能します
- 22. Spring、Maven(最初に契約)でWSDLからWebServiceを生成
- 23. Emberでの約束の作成
- 24. 約束の約束に加入する方法
- 25. Express - ループクエリーのときに約束する約束
- 26. 約束とは別にお約束します。
- 27. 約束を返すには?
- 28. は角 - 約束
- 29. は約束
- 30. setTimeoutと約束
あなたは 'Promise.any'([ブルーバード](http://bluebirdjs.com/docs/api/promise.any.html)を探している、[クリード](https://github.com/briancavalier/creed#any-iterable-promise-ea-promise-ea)、[WinJS](https://msdn.microsoft.com/en-us/library/windows/apps/br229660.aspx)、... ) – Bergi