2015-09-14 72 views
1

我读过几篇关于在Javascript中使用“睡眠”或“等待”的文章。但是,它们都使用客户端Javascript。我需要在Scheduled NetSuite SuiteScript中执行此操作。我试过setTimeout(),它告诉我它找不到函数(以及window.setTimeout())。NetSuite预定脚本“睡眠”

如果我必须做一个无限循环if条件,给我我想要的延迟,我会这样做,但它不是理想的。我想知道是否有一种简单的“睡眠”或“等待”方式来延迟执行代码。

我的目的是因为我的代码删除记录。在我当前的设置中,如果这些记录中的2个被删除的距离太近,NS会引发“意外错误”并停止。如果两者之间存在足够长的停顿,那么它就会起作用。我试图自动化,所以我不会在这里整天删除记录。

到目前为止,我已经检查了帖子: How to create javascript delay function JavaScript.setTimeout JavaScript sleep/wait before continuing What is the JavaScript version of sleep()?

煤矿是不是重复对所有这些,因为他们所有的假设客户端和不特定NetSuite的SuiteScript。谢谢!

回答

1

如果您要在计划脚本中删除记录,那么这些记录将连续运行。你有没有试过用try-catch包装nlapiDeleteRecord调用?

如果您收到错误,那么运行用户事件或工作流脚本并抛出错误?

只要等待我做了以下。它存在抛出太多指令错误的风险,但避免了可能会导致治理的数据库调用。如果你可以找到一个很好的API调用和0治理成本,吃一段时间会更好,但这对我来说已经足够好了。

function pause(waitTime){ //seconds 
    try{ 
     var endTime = new Date().getTime() + waitTime * 1000; 
     var now = null; 
     do{ 
      //throw in an API call to eat time 
      now = new Date().getTime(); // 
     }while(now < endTime); 
    }catch (e){ 
     nlapiLogExecution("ERROR", "not enough sleep"); 
    } 
} 
+0

我还没有尝试过/ catch。即使我发现错误,我也不确定这会有什么帮助。到目前为止,我注意到需要大约10分钟的等待时间。 错误是由于内置的​​库存模块。我们可以告诉的是,如果您删除与同一个SO相关的2个配送太快,则会引发意外错误。我们相信(和NS同意),这是因为它正在对后端进行库存处理。因此需要延迟来完成这个过程。我会尝试你的上面的代码现在 – TMann

+0

如果你真的需要等待10分钟,那将是令人惊讶的,但如果是这样的话,那么就这样吧。如果您真的需要等待,为什么不让您的预定脚本一次删除一条记录,并安排它每15分钟运行一次?或者,如果问题仅表明与同一SO相关的履行情况,那么在您的预定脚本中,将您的履行按SO分组,并且仅删除每个SO的第一个关联履行。 – erictgrubaugh

+0

您是否已将会计期间开启但未合理关闭?我有一个有类似错误的客户 - 他们从未关闭会计期间,每次库存移动都会导致库存水平重新运行约4年(每天3-4万个订单)。 – bknights

1

做一个基于循环的等待可能是一个开销,因为有时NetSuite可能会警告脚本语句的数量。

执行睡眠的另一种方法是使用nlapiRequestURL()并在Web服务器上编写服务,因为它在服务器端阻塞并同步。您可以编写HTTP服务,然后在您的Web服务器上执行睡眠任务,然后响应客户端。