Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待RESTAPI返回结果,然后再次调用api_Javascript_Reactjs_Settimeout_Axios - Fatal编程技术网

Javascript 等待RESTAPI返回结果,然后再次调用api

Javascript 等待RESTAPI返回结果,然后再次调用api,javascript,reactjs,settimeout,axios,Javascript,Reactjs,Settimeout,Axios,除了setTimeout()之外,还有其他方法等待api调用后返回结果,然后在收到结果后立即再次调用该api吗 在我的例子中,我必须调用n次(取决于用户输入),api调用需要20-40秒的时间来处理并从后端返回结果。如果我发送另一个请求,而上一个请求仍在后台处理,那么它会中断后端 一旦收到并完全处理结果,调用api的正确方法是什么 sendRequest() { let self = this; function f() { if (self.st

除了
setTimeout()
之外,还有其他方法等待api调用后返回结果,然后在收到结果后立即再次调用该api吗

在我的例子中,我必须调用
n
次(取决于用户输入),api调用需要20-40秒的时间来处理并从后端返回结果。如果我发送另一个请求,而上一个请求仍在后台处理,那么它会中断后端

一旦收到并完全处理结果,调用api的正确方法是什么

sendRequest() {
    let self = this;
        function f() {
            if (self.state.callPerSite < self.state.selectedSites.length) {
                self.processData(transid);
                   setTimeout(f, 20)
                }
            } else {
                self.setState({progress: 100});
            }
        }
        f();
} 

processData(transid) {
        rest.apiCall({transactionId: transid}, 'json').then(results => {

            if (!firstCallIsProcessed) {
                firstCallIsProcessed = true;
            }
            callPerSite++;

            this.setState({
                resultsData: results.data,
                callPerSite: callPerSite
            });

        }).catch(err => this.onError(err));
sendRequest(){
让自我=这个;
函数f(){
if(self.state.callPerSite{
如果(!firstCallIsProcessed){
firstCallIsProcessed=true;
}
callPerSite++;
这是我的国家({
结果数据:results.data,
胼胝石
});
}).catch(err=>this.onError(err));

您想看看新的waitasync方法

请查看以下内容:

只是一些更改:

  • 只需在
    return
    关键字前加前缀,即可使函数
    processData
    返回承诺:

    return rest.apiCall(  // ....
    
  • 在返回值上使用
    then
    方法链接对
    f
    的调用,而无需进一步调用
    setTimeout

    self.processData(transid).then(f)
    

就是这样。

。我所说的“方法”实际上是指“方法”。我想我不必使用
setTimeout()
?确实,您不需要它。顺便说一句,
rest.apiCall
是一个axios调用,当您说只需将return关键字放在rest.apiCall之前,您也可以将
return
放在那里,但这是另一个原因:这将确定承诺的值。没有它,承诺的值对于您的cas来说是
未定义的
e这并不重要,因为您的主代码只是在承诺解决后查看
状态。我所说的
返回
是必需的,因为否则您的函数根本不会返回承诺(它不会返回任何内容),因此您将无法将
然后
链接到它。请注意“承诺”之间的区别和“承诺值”。
processData(transid){return;rest.apiCall({transactionId:transid},'json')
…}