【问题标题】:Conditional For Looping in Typescript / Javascript based on value returned by a async call [duplicate]基于异步调用返回的值的 Typescript / Javascript 中的条件 For 循环 [重复]
【发布时间】:2017-10-22 20:37:40
【问题描述】:

这是我的要求。我的代码调用了一个返回 json 对象的网络服务器(让我们称之为http://myapi/:id)。

我的网站是一个离子应用程序,调用此 api 服务器 'n' 次。 'n' 的值是用户定义的。

期望每个 api 调用必须在下一次 api 调用之前完全执行,并且返回的 json 对象需要在运行下一次 api 调用之前传递一组条件。如果 json 对象未能通过条件检查,则 for 循环的执行将停止。

代码应如下所示。

getObjects(count: number){
for(i = 0; i < count; i++){
    myapi.get().then(val=>{
            if(val.flag == true){
                ;
              }else{
                break;
               }
     })
  }
}

getObjects(10);

【问题讨论】:

  • 经过大量试验和错误并阅读了异步等待、异步生成器等。这就是我已经解决的问题。
  • 你有什么问题?
  • @Code-Apprentice 大声笑我是不是很困惑!好吧,我有一个需要获取数据的新闻提要。当我发出 get req 时,每个新闻项都作为 json 对象接收。
  • 需要的是我希望在发送下一个 get 请求之前完成一个 get 请求。只是不希望服务器被获取请求淹没,而且可能没有任何消息可以显示。此数据是返回的 json 的一部分。所以我必须在进行下一个 get 调用之前评估 json。因为 for 和 while 循环是同步的。他们没有用。我也尝试使用等待。但这不起作用。

标签: javascript for-loop asynchronous


【解决方案1】:

这是我迄今为止发现的工作。

var i = 0;
getObject(i: number,count: number){

   myAPI.then(val=>{
     if(i < count){
       if(val == true){
            //dome some stufff
            i = i + 1;
            getObject(i, count);
       }
     }
   }).catch(err=>{
      //deal with error; 
   });


//User invoked call

getObject(i, 10);

欢迎任何改进和建议。

【讨论】:

  • 在同一个函数中调用一个函数。
【解决方案2】:

一直针对您想要的方法使用/调用:getObjects(10); 并想出了这样的东西:

getObjects(maxCount: number) {
    this.getObjectsLoop(maxCount);
}

getObjectsLoop( maxCount: number, count: number = 0) {
    count++;
    this.requestObject().then(
        (val) => {
            //do whatever with val ?

            if(count <= maxCount){
                this.getObjectsLoop(maxCount,count);
            }
            else {
                // this was the last request.
            }
        },
        (err) => {
            // stop sending request
        }
    );
}

requestObject(): Promise<any> {
    return myapi.get().then(
        (val) => {
            return val.flag? val : Promise.reject('Did not pass the success data flag/condition');
        },
        (err) => {
            return Promise.reject(err);
        }
    );
}

试试看。您可以将其他两个函数声明为 private 方法。实际上,您可以直接调用 getObjectsLoop(10) 和/或将其重命名为 getObjects 并删除第一个函数。我故意这样做是为了让您可以将最后两个函数声明为私有,而 getObjects 的 Ts IntelliSense 将只显示并允许一个参数 (maxCount)。

【讨论】:

  • 我的最终实现看起来与您的答案非常相似,并且只有两个建议的功能。有趣的是,我们最终采用了相同的方法并且只有两个功能。或者,也许您天生就是一个想要编写尽可能少的代码的懒惰开发人员。大声笑:)。
  • 我忘了添加像我一样的懒惰;)。您在声明它的位置为 count 分配值也非常有趣。下次我必须实施它时,我会记住这一点。我从来没有见过它这样做。欢呼队友,感谢您的帮助。
  • 它只是为count 声明一个默认值,因为您没有在该参数中输入任何值。不客气。
  • 嘿,更少的代码意味着更多的可读代码。如果称它为懒惰仍然合适,那么它是否可以称为“道德”懒惰或其他东西。哈哈哈。干杯。
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多