2016-07-31 4 views
1

私はajaxで遊んでいます& ajax呼び出しの抽象版を作成することを約束しました。以下のコードは正常に動作しています。外部コールバック内のPromisの解決/拒否

function ajax(url){ 
    var xhr = { 
     rq : function (method, url){ 
      var prom = new Promise(function (resolve, reject){ 
       var client = new XMLHttpRequest(); 
       //only accept 
       client.open(method,url,true); 
       client.send(); 
       client.onload = function(){ 
        if(this.status == 200){ 
         if(this.response == "1"){ 
          reject(this.response); 
         } 
         else{ 
          resolve(this.response); 
         } 
        } 
        else{ 
         reject(this.statusText); 
        } 
       }; 
      }); 
      return prom; 
     } 
    }; 
    return { 
     'get' : function(){ 
      return xhr.rq('GET', url); 
     } 
    }; 
} 

私はajax.onload上の関数は、コールバックとして渡すことが抽象的にしたいと私はこのような何かを考えていたが:

function ajax(url, checker){ 
    var xhr = { 
     rq : function (method, url){ 
      var prom = new Promise(function (resolve, reject){ 
       var client = new XMLHttpRequest(); 
       //only accept 
       client.open(method,url,true); 
       client.send(); 
       client.onload = checker; 
       }; 
      }); 
      return prom; 
     } 
    }; 
    return { 
     'get' : function(){ 
      return xhr.rq('GET', url); 
     } 
    }; 
} 

function chk1(){ 
    if(this.status == 200){ 
     if(this.response == "1"){ 
      reject(this.response); 
     } 
     else{ 
      resolve(this.response); 
     } 
    } 
    else{ 
     reject(this.statusText); 
    } 
} 

は、残念ながら、私は解決のエラーを取得し、拒否不明です。私は問題がちょうどchk1の中にあることを知っています。約束は分かっていません。しかし、私はそれを解決する方法は不明です。

私はそれを呼び出すことができるように、このような何かしたい:

Promise.all([ajax(u,chk1).get(),ajax(v,chk1).get()]) 
.then(callback.success) 
.catch(callback.error); 

種類よろしく

+0

あなたが好きですが必要になる場合があります 'client.onload = checker.bindできるようにするには、'(これは、拒否、解決します)あなたのチェッカーのコールバック内で約束のコールバックを解決して拒否することを参照する。 – Redu

答えて

2

、必要に応じて、それはそれらを呼び出すことができますので、あなたはチェッカー機能にresolverejectを渡すことができます。

function ajax(url, checker) { 
    var xhr = { 
     rq: function(method, url) { 
      var prom = new Promise(function(resolve, reject) { 
       var client = new XMLHttpRequest(); 
       //only accept 
       client.open(method, url, true); 
       client.send(); 
       client.onload = function() { 
        checker.call(this, resolve, reject); 
       }; 

      }); 
      return prom; 
     } 
    }; 
    return { 
     'get': function() { 
      return xhr.rq('GET', url); 
     } 
    }; 
} 

function chk1(resolve, reject) { 
    if (this.status == 200) { 
     if (this.response == "1") { 
      reject(this.response); 
     } else { 
      resolve(this.response); 
     } 
    } else { 
     reject(this.statusText); 
    } 
} 
+0

ありがとう!しかし、私はこれも議論に変えなければならないことがわかった。 – Snake707

+1

@ Snake707 - 私はすでにこの問題を修正していますので、 'this'は保存されています。 – jfriend00

+0

ありがとう:)素敵なトリック! – Snake707

1

気になる人には。 jfriend00の答えは金です​​。私の最終的な解決策は、このようになります(私は別のPARAMTERにこれを使用してから変更しなければならなかった):

function ajax(url, checker){ 
    var xhr = { 
     rq : function (method, url){ 
      var prom = new Promise(function (resolve, reject){ 
       var client = new XMLHttpRequest(); 
       //only accept 
       client.open(method,url,true); 
       client.send(); 
       client.onload = checker(resolve, reject, client); 
       }); 
      return prom; 
     } 
    }; 
    return { 
     'get' : function(){ 
      return xhr.rq('GET', url); 
     } 
    }; 
} 

function chk1(resolve, reject, xhr){ 
    if(xhr.status == 200){ 
     if(xhr.response == "1"){ 
      reject(xhr.response); 
     } 
     else{ 
      resolve(xhr.response); 
     } 
    } 
    else{ 
     reject(xhr.statusText); 
    } 
} 
+1

これは動作しません。 'client.onload = checker(resolve、reject、client);'は 'onload'イベントが発生したときではなく' checker() 'を直ちに呼び出します。 – jfriend00

+0

ありがとう!私は今それを見る。 – Snake707