2016-07-14 17 views
0

jqueryを使用しないプロジェクトに取り組んでいます。サポートされているすべてのブラウザには、固有の約束があります。ネイティブのjavascriptの約束で遅延パターンを実行するにはどうすればよいですか?

私は、これはネイティブの約束で行うことができますどのようにjqueryの$ .Deferred

//Example 
var deferred1 = new $.Deferred(); 
var deferred2 = new $.Deferred(); 

$.get(someUrl, function(){ 
    ... 
    deferred1.resolve() 
}) 

$.get(someUrl, function(){ 
    ... 
    deferred2.resolve() 
}) 

$.when(deferred1, deferred2).then(function(){//do stuff}) 

を介して提供繰延パターンを複製したいと思いますか?

+0

これらdefferedsが約束されています。それらを同じ方法で使用してください。しかしあなたは約束を使用する自分のgetを作成する必要があるようです - http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promisifying-xmlhttprequest – llamerr

答えて

2

これを試してください:

function get(url) { 
    //Make and return new promise, it takes a callback: 
    //A function that will be passed other functions via the arguments resolve and reject 
    return new Promise((resolve, reject) => { 
     var request = new XMLHttpRequest(); 
     request.addEventListener("load",() => { 
      //Success ! we need to resolve the promise by calling resolve. 
      resolve(request.responseText); 
     }); 
     request.addEventListener("error",() => { 
      //Error! we need to reject the promise by calling reject . 
      reject(request.statusCode); 
     }); 
     //Perform the request 
     request.open('GET', url); 
     request.send(); 
    }); 
}; 

var urls = [ 
     'https://httpbin.org/ip', 
     'https://httpbin.org/user-agent' 
]; 
//Create an array of promises 
// is equivalent to 
//var promises = []; for(var i in urls) promises.push(get(url[i])); 
var promises = urls.map(get); 

//The Promise.all(iterable) method returns a promise that resolves when 
//all of the promises in the iterable argument have resolved, 
//or rejects with the reason of the first passed promise that rejects. 
Promise.all(promises).then(function (responses) { 
    console.log(responses); 
}); 

デモ:https://jsfiddle.net/iRbouh/52xxjhwu/

+0

いくつかの説明はいいと思います。そうでなければ、良い答え! – Pavlo

+1

私はコードをコメントしましたそれをチェックしてください;) –

関連する問題