Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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 立即解决的承诺_Javascript_Asynchronous_Promise - Fatal编程技术网

Javascript 立即解决的承诺

Javascript 立即解决的承诺,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我需要从多个API调用中检索数据,并通过单击UI中的按钮来聚合它们。我需要在数据全部执行完毕后打印数据。我将从运行for循环的函数返回一个承诺,即连续进行所有API调用。在接收API调用结果时,我也在处理这些结果。因此,我在for循环之外解析承诺。(提醒,for循环在内部进行了一些API调用。)现在,当我调用这个函数时,promise会立即得到解决,success函数会运行,这基本上会给我提供不期望的空聚合数据。在这种情况下,我应该在哪里/如何解决承诺 我的代码的基本结构: forLoopFun

我需要从多个API调用中检索数据,并通过单击UI中的按钮来聚合它们。我需要在数据全部执行完毕后打印数据。我将从运行for循环的函数返回一个承诺,即连续进行所有API调用。在接收API调用结果时,我也在处理这些结果。因此,我在for循环之外解析承诺。(提醒,for循环在内部进行了一些API调用。)现在,当我调用这个函数时,promise会立即得到解决,success函数会运行,这基本上会给我提供不期望的空聚合数据。在这种情况下,我应该在哪里/如何解决承诺

我的代码的基本结构:

forLoopFunction(xyz)
  .then(function(){ // print aggregate data when successfull})
  .catch(function(){ // print couldn't retrieve data })


forLoopFunction(){

   return new Promise(resolve, reject){
     for(var i=0; i<...){
       api1_Call().$promise
         .then(
            api2_call().$promise
             .then(
               //work on aggregate data
            )
            .catch(reject(error))
         ).
        .catch(reject(error))
     }
     //end of for loop 
     resolve(aggregated_data);
 }
}
forLoopFunction(xyz)
.then(函数(){//成功时打印聚合数据})
.catch(函数(){//print无法检索数据})
forLoopFunction(){
返回新承诺(解决、拒绝){

对于(var i=0;i您应该维护对所有
api
调用的承诺,然后
通过使用
promise在一次内解析所有
调用。所有
,这将以每个
api
调用的数组的形式为您提供
中的数据,然后
回调

forLoopFunction(xyz)
  .then(function(data){ console.log(data); // print aggregate data when successfull})
  .catch(function(){ // print couldn't retrieve data })


forLoopFunction(){
  var promiseArray = [];
     for(var i=0; i<...){
       var promiseObject =  new Promise(function(resolve, reject){
       api1_Call().$promise
         .then(
            api2_call().$promise
             .then(
               resolve(aggregated_data);
            )
            .catch(reject(error))
         ).
        .catch(reject(error))
        });
       promiseArray.push(promiseObject);
     }
   return Promise.all(promiseArray)
}
forLoopFunction(xyz)
.then(函数(数据){console.log(数据);//成功时打印聚合数据})
.catch(函数(){//print无法检索数据})
forLoopFunction(){
var promiseArray=[];

对于(var i=0;我能为这两个api调用创建两个单独的承诺,并使用Promise.all([array of your promises])一次性解决它们吗这将并行运行所有的计算,并在一天内解决它们。对不起,我做出了回答,因为我的声誉,我不能发表评论。据我所知,因为是一个同步迭代器,这意味着,它不会等到你的承诺解决,开始下一个循环。也许你可以检查新的等待新的功能,以实现你想要的。首先,你需要了解您的api调用是非阻塞的。因此,
循环运行到完成,启动所有api调用,然后调用
resolve()
,然后很长一段时间后,api调用开始完成。因此,您对
resolve()的调用
与api调用的结果完全无关,因为您在api调用完成之前就调用了它。我建议(您方面)调查
Promise.all()
。第二个代码块甚至不进行解析-在执行
$的代码块中,ajax
-您不需要等待它完成,也不需要从中返回任何内容。然后……事实上,您有一堆
承诺。解析
承诺。拒绝绝对没有任何作用的
调用(因为它们是多余的,而且您无论如何都不会返回它们)您也在推送一个承诺,该承诺永远不会解决/拒绝
promiseArray.push(新承诺(函数(解析,拒绝){
…决不调用resolve或reject-您也会无缘无故地引用一些未定义的变量
promiseObject
!最后,您的代码缩进超出了顶部!这是一个主要的反模式。没有理由这样将一个承诺包装成另一个。这没有任何区别。有没有办法查看promise是否正在解决或正在进行中?如果我一直等待,控制台不会打印任何内容,但核心逻辑已运行完毕,不会落入任何.catch()块
forLoopFunction(xyz)
  .then(function(data){ console.log(data); // print aggregate data when successfull})
  .catch(function(){ // print couldn't retrieve data })


forLoopFunction(){
  var promiseArray = [];
     for(var i=0; i<...){
       var promiseObject =  new Promise(function(resolve, reject){
       api1_Call().$promise
         .then(
            api2_call().$promise
             .then(
               resolve(aggregated_data);
            )
            .catch(reject(error))
         ).
        .catch(reject(error))
        });
       promiseArray.push(promiseObject);
     }
   return Promise.all(promiseArray)
}