2017-05-30 8 views
0

私は$ .when

var d1 = $.Deferred(); 
var d2 = $.Deferred(); 

$.when(d1, d2).done(function (v1, v2) { 
    console.log(v1); // "Fish" 
    console.log(v2); // "Pizza" 
}); 

d1.resolve("Fish"); 
d2.resolve("Pizza"); 

新しい約束を使用する方法をsimpel書き換えるecma6約束を使用しようとしていますか?

よろしく

目標は、約束の範囲外の約束を解決することです。

+0

あなたが実際に非同期のユースケースを持っていますか? – Bergi

+0

何か試しましたか? – Bergi

+1

"*目標は約束の範囲外の約束を解決することです* * - なぜですか? [あなたは決してするべきではありません](https://stackoverflow.com/a/37426491/1048572)。あなたの[実際の問題](https://meta.stackexchange.com/q/66377)は何ですか? – Bergi

答えて

2

約束は、あなたのニーズに応じて、多くの方法で書くこともできますので、これらの3つの例は、あなたのjQueryの例に近いものでなければならない:

var d1 = (v)=>new Promise(r=>r(v)) 
 
var d2 = (v)=>new Promise(r=>r(v)) 
 
var dd1 = d1('Fish') 
 
var dd2 = d2('Pizza') 
 

 
Promise.all([dd1, dd2]).then((v)=>{ 
 
    console.log(v[0]+', '+v[1]); 
 
}); 
 

 
//or 
 

 
var d1 = new Promise(r=>r('Fish')) 
 
var d2 = new Promise(r=>r('Pizza')) 
 

 
Promise.all([d1, d2]).then((v)=>{ 
 
    console.log(v[0]+', '+v[1]); 
 
}); 
 

 
//or 
 

 
var d1 = Promise.resolve('Fish') 
 
var d2 = Promise.resolve('Pizza') 
 

 
Promise.all([d1, d2]).then((v)=>{ 
 
    console.log(v[0]+', '+v[1]); 
 
});

ので、ここでOKが、外からそれを解決する方法は次のとおりです。

var reolveMe = []; 
 

 
var d1 = new Promise(r=>reolveMe.push(r)) 
 
var d2 = new Promise(r=>reolveMe.push(r)) 
 

 
Promise.all([d1, d2]).then((v)=>{ 
 
    console.log(v[0]+', '+v[1]); 
 
}); 
 

 
reolveMe[0]('a') 
 
reolveMe[1]('b') 
 

 
//or more OOP 
 

 
function myPromise() { 
 
    var myResolve; 
 
    this.promise = new Promise(r=>myResolve=r) 
 
    this.resolve = myResolve; 
 
} 
 

 
var d1 = new myPromise() 
 
var d2 = new myPromise() 
 

 
Promise.all([d1.promise, d2.promise]).then((v)=>{ 
 
    console.log(v[0]+', '+v[1]); 
 
}); 
 

 
d1.resolve('a') 
 
d2.resolve('b')

+0

目標は、約束の範囲外の約束を解決することです。 – yarek

+0

これはトリックを行う必要があります:) –

0

jQueryは、複数の約束を解決するためのいくつかの異なる構文を持っているようです。私が考えることのできる最も近いものはPromise.allを使うことでしょう。

let p1 = new Promise((resolve) => resolve('Pizza')); 
let p2 = new Promise((resolve) => resolve('Fish')); 

Promise.all([p1, p2]).then((values) => { 
console.log(values[0]); //Pizza 
console.log(values[1]); //Fish 
}); 

JS promise APIは、jQueryの提供するものと正確に一致しません。たとえば、Promise.defer()はdeprecated method.です。そのMDN page hereには延期の例があります。 MDNスニペットに基づいて

クラスの実装:

class Deferred { 
    constructor() { 
    this.promise = new Promise((resolve, reject) => { 
    this.resolve = resolve; 
    this.reject = reject 
    }); 
    } 
} 
+0

目標は、約束の範囲外の約束を解決することです。 – yarek

+0

私が言及したように、遅延メソッドは非難されています。ただし、同じページには互換性の例があります。https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred#backwards_forwards_compatible多分それがあなたが探しているものでしたか? – laughingpine

関連する問題