【问题标题】:How to maintain Timeout Session when calling Api Call in Loop Contion在循环条件下调用 Api 调用时如何保持超时会话
【发布时间】:2018-09-13 22:21:01
【问题描述】:

我有在 For 循环中执行的 Api 调用,一些值本身返回 10 秒,一些可能需要近 60 秒我必须保持适当的超时和清除会话(即,如果结果出现在 15 秒意味着它应该进入下一个输入值并运行代码)但目前每条记录等待 45 秒如何优化它

这里是我的示例代码:

if (selectedrows.length >= 1) {
for (var i = 0; i < selectedrows.length; i++) {
var myVar = setTimeout (function (k) {
    var ob = { results: "Appending ..." };

    child.update(selectedrows[k][4], selectedrows[k][4], ob);

    var fullName = selectedrows[k][1] + ' ' + selectedrows[k][2];
             math.ResultCall.async(fullName,function (err, res) {

   if (err) throw err;

        var returnedValue = JSON.parse(res);
        console.log(returnedValue);
        if(returnedValue.Result == null || returnedValue.Result.FOUND_Result == null)
       {
                console.log("None found")

            }
        else{

    var obj = { results: “res” };
    child.update(selectedrows[k][4], selectedrows[k][4], obj);

  }

}

});

 }, i * 45000,i);

}
}

【问题讨论】:

  • 为什么需要 setTimeout?不用 setTimeout 也能跑?

标签: javascript session-timeout clearinterval


【解决方案1】:

有几种方法可以实现该解决方案
1.Async-Await:如果记录处理顺序很重要

for( let i=0; i<selectedrows.length; i++)
{
  let ob = { results: "Appending ..." };

  child.update(selectedrows[i][4], selectedrows[i][4], ob);
  let fullName = selectedrows[i][1] + ' ' + selectedrows[i][2];

  await new Promise((resolve,reject)=> 
    {
      math.ResultCall.async(fullName,(err, res) => {
        if (err) reject(err);
        let returnedValue = JSON.parse(res);
        console.log(returnedValue);
       if(returnedValue.Result == null || returnedValue.Result.FOUND_Result == null) {
            console.log("None found")
        } else {
           let obj = { results: “res” };
           child.update(selectedrows[i][4], selectedrows[i][4], obj);
         }
     resolve();
    });
}

**不要忘记这意味着包装函数也应该是异步的(它返回一个可以在必要时解决的承诺)

2.Promise.All: 如果顺序不重要

let promArray = [];
for( let i=0; i<selectedrows.length; i++)
{
  let ob = { results: "Appending ..." };

  child.update(selectedrows[i][4], selectedrows[i][4], ob);
  let fullName = selectedrows[i][1] + ' ' + selectedrows[i][2];
  promArray.push( new Promise((resolve,reject)=> 
    {
      math.ResultCall.async(fullName,(err, res) => {
        if (err) reject(err);
        let returnedValue = JSON.parse(res);
        console.log(returnedValue);
       if(returnedValue.Result == null || returnedValue.Result.FOUND_Result == null) {
            console.log("None found")
        } else {
           let obj = { results: “res” };
           child.update(selectedrows[i][4], selectedrows[i][4], obj);
         }
     resolve();
    });
  ); 
}
Promise.all(promArray);

** 这也将返回一个可以在必要时解决的 Promise。

【讨论】:

  • 试过第一个例子得到错误:Uncaught SyntaxError: Unexpected token new
【解决方案2】:

重新表述您的问题,当您的 api 得到解决时,您需要返回数据。 为此请通过https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve

JavaScript,由于它的事件循环,默认情况下它是异步工​​作的。 当您的 api 返回数据时,您已承诺并决心得到通知

希望我能帮上忙 :)

【讨论】:

    猜你喜欢
    • 2010-12-29
    • 2012-12-15
    • 2011-12-19
    • 1970-01-01
    • 2021-08-27
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多