2017-02-24 6 views
1

私はJQueryの約束と遅延オブジェクトの周りに私の頭をラップするのに苦労していますので、私に同行してください。また、私のアプリケーションでReact、Typescript、およびES6を使用しているとも言えます。Web APIへの同期JQueryコール

のは、私はオブジェクトの配列を持っているとしましょう:私は何をしようとしている

[{ Object }, { Object}, { Object }] 

は、アレイ内の各オブジェクトに対して、オブジェクトは異なるパラメータでAPIへの呼び出しを作る、です応答を取得し、残りのオブジェクトに対して同じAPIを別の呼び出しを行います。基本的には、これらの呼び出しをまとめてチェーン化し、一度に1つずつ作成してから、それらをアプリケーション状態に追加します。ここで

は、私がこれまで持っているものだが、それは動作していない、明らかに、です:

private getData(options: any[]): void { 
    let promises: any[] = []; 

    options.map((option: any, key: number) => { 
     let deferred: JQueryDeferred<any> = $.Deferred(); 
     deferred.done((response) => { 
      return this.getIndividual(option) 
       .done(response => { 
        console.log('done', response); 
       }); 
     }); 

     promises.push(deferred); 
    }); 

    $.when.apply($, promises) 
     .then((response) => { 
      console.log('response', response); 
     }).fail((error) => { 
      console.log("Ajax failed"); 
     }) 
     .done(() => { 
      console.log('done'); 
     }); 
} 

private getIndividual(option: any) { 
    return apiCall(option.hashKey); 
} 
+0

[この標準QA](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call)を読んだか? –

+0

'options.map'を使用し、結果を効果的に破棄することは無意味です –

+0

[解決は次々と約束しますか?](http://stackoverflow.com/questions/24586110/resolve-promises-one-後で別の順序で) – Andreas

答えて

2

あなたの呼び出しがお互いに依存しない、あなたは一度だけ、すべての約束があり、それらに基づいて行動する必要がある場合完全な、Promise.all使用:

var xhr1 = doXhrPromise(1); 
var xhr2 = doXhrPromise(2); 
var xhr3 = doXhrPromise(3); 
var xhr4 = doXhrPromise(4); 

Promise.all([xhr1, xhr2, xhr3, xhr4]).then(() => { 
    // do something once all the promises resolve 
}); 

を次の呼び出しは、前の呼び出しからのデータに依存しているので、あなたが順番に呼び出しを行う必要がある場合は、ちょうどそうのようにそれらを一緒にチェーン:

doXhrPromise(1) 
.then((data) => { return doXhrPromise(data.nextId); }) 
.then((data) => { return doXhrPromise(data.nextId); }) 
.then((data) => { return doXhrPromise(data.nextId); }) 
.then((data) => { return doXhrPromise(data.nextId); })