2017-05-30 63 views
0

我試圖用ecma6承諾重寫simpel $。當

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"); 

任何方式使用新的承諾?

問候

的目標是要解決OUTSIDE承諾的範圍的承諾。

+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。我能想到的最接近的就是使用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承諾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