2017-03-21 1 views
0

私の約束を理解するのは、単に外部環境(ブラウザ、node.jsなど)に固有の非同期関数のラッパーのことです。私は、約束を使って非同期操作を適切に一緒に接続するソフトウェアを実際に書く方法については混乱しています。ここに私の問題があります:約束事に包まれた別の非同期操作を連鎖する方法

以下のコードでは、setTimeoutの機能が約束されています。私はまた約束でXMLHttpRequestコールをラップしました。私は、(間違って)私はそれらがタイマーが実行され、 AJAXの呼び出しが行われるように一緒にチェーンしている場合を想定していた。これは起こりません。最初にAJAX呼び出しが発生します。

timer(1000).then(AJAXGetRequest('https://itunes.apple.com/hk/rss/topalbums/limit=10/json')) 

私の約束を以下のように変更すると、期待通りに機能します!

timer(1000).then(function(){ 
    AJAXGetRequest('https://itunes.apple.com/hk/rss/topalbums/limit=10/json') 
}) 

上記のコードの問題は、非同期操作でコールバックを使用することに戻ります。 私が仮定は、私は、コールバックに戻す必要はありませんので、私のコードを書くための方法であると、私はこのような何か行うことができます。

timer(1000) 
    .then(AJAXGetRequest('some/api')) 
    .then(timer) // wait 
    .then(AJAXGetRequest('someOther/api')) 
    .then(timer) // wait 
    .then(AJAXGetRequest('another/api')) 
        // wait 

、あるいは、より柔軟:

timer(1000) 
    .then(AJAXGetRequest('some/api')) 
    .then(timer(200)) // wait 
    .then(AJAXGetRequest('someOther/api')) 
    .then(timer(600)) // wait 
    .then(AJAXGetRequest('another/api')) 
        // wait 

を以下は、前の例のコードの残りの部分です:あなたはそれを、それはそれで何をすべきかわからないだろう約束を与える場合

let timer = function(value) { 
    return new Promise((resolve, reject) => { 

     setTimeout(() => { 

      console.log(value); 
      resolve(value); 

     }, value); 

    }); 
}; 


let AJAXGetRequest = function(URL) { 
    return new Promise((resolve, reject) => { 

     var getRequest = new XMLHttpRequest(); 
     getRequest.open('get', URL, true); 
     getRequest.send(); 

     getRequest.onload = function() { 

      var JSONObject = JSON.parse(getRequest.responseText); 
      console.log(JSONObject); 
      resolve(JSONObject); // object 
     } 


    }); 
}; 
+0

約束には、コールバックを約束したことはありません。 – Bergi

+0

[ES6約束:引数を使って関数を連鎖させる方法]の可能な複製(http://stackoverflow.com/questions/36627845/es6-promises-how-to-chain-functions-with-arguments) – jib

答えて

1

<Promise>.thenは、機能を取ります。

あなたがその署名を一致させるために.thenに渡すものを変更していることを解決することができます:

timer(1000) 
 
.then(() => AjaxRequest(url1)) 
 
.then(() => timer(1000)) 
 
.then(() => AjaxRequest(url2)) 
 
.then(() => timer(1000));

関連する問題