此 TypeScript 代码会引发"RangeError: Maximum call stack size exceeded"错误,但仅当有多个项目时



我很好奇是否有人遇到过这个问题。我认为这可能是sublistChanged()被触发时发生的某种递归,但我不知道如何修复它。

export function sublistChanged (ctx: EntryPoints.Client.sublistChangedContext) {
const rec = X.getTx(ctx)
const total = _.sumBy(rec.item, (line: POItemSublist | TOItemSublist) => line.quantity * line.custcol_atlas_item_weight!)
rec.custbody_totalitemweightorder = total
}

看起来你在使用带有下划线和其他库的Typescript。

IMO努力使Netsuite更像"传统"的环境是相当令人担忧的。

大多数列表推导可以很容易地管理,只需一个更Netsuite友好的迭代器。我有一个片段:

function iter(rec:record.Record, listName, cb, doReverse? :boolean){

var i = 0;
var getV = function (fld){
return rec.getSublistValue({sublistId:listName, fieldId:fld, line:i});
};
if(doReverse){
i = rec.getLineCount({sublistId:listName}) - 1;
for(; i>= 0; i--){
cb(i, getV);
}
}else{
var lim = rec.getLineCount({sublistId:listName});
for(; i< lim; i++){
cb(i, getV);
}
}
}

所以你的代码看起来像:

export function sublistChanged (ctx: EntryPoints.Client.sublistChangedContext) {
const rec = ctx.currentRecord;
let total = 0;
iter(rec, 'item', (idx, getV)=>{
total += getV('quantity') * getV('custcol_atlas_item_weight')!;
});
rec.setValue({fieldId:'custbody_totalitemweightorder' ,value:total, ignoreFieldChange:true, forceSyncSourcing: true});
}

ignoreFieldChange可以跳过,如果你想要触发正常的下游事件处理,但在设置总权重字段通常也会触发脚本的情况下,你可能需要这个。

forceSyncSourcing导致setValue动作在下一个动作发生之前完全完成。

相关内容

  • 没有找到相关文章

最新更新