2017-02-24 57 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); })