2017-02-24 40 views
1

我很難把頭繞在JQuery承諾和延期對象上,所以請耐心等待。我還應該說我的應用程序正在使用React,Typescript和ES6。Web API的同步JQuery調用

比方說,我有對象的數組:

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

我想要做的是,對陣列中的每個對象,撥打電話出去的API與該對象的不同參數,獲取響應,然後再對另一個對象調用相同的API。基本上,我想將這些調用鏈接在一起,所以我一次一個,然後將它們添加到我的應用程序狀態。

這裏就是我這麼遠,但它很明顯,不工作:

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

你讀過[this canonical 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); })