简体   繁体   中英

Error with setTimeout() function in for loop

I have the following script that I need to adjust so that each iteration has a one second pause before or after it executes the loop (it doesn't really matter which as long as the lag is there). I tried to add the setTimeout() function into the Try section of my code but it is still consistently failing. I also have tried to use "let" instead of "var" in the for loop but that failed as well. Any advice on how to add it in would be very appreciated. I'm having trouble finding an example of a similar setTimeout() function within a for loop online.

var ZB_DataExtension = 'C7_Unsubscribe_Response'; 
var ZB_DataExtension_Response = 'C7_Unsubscribe_Response'; 
var ZB_DataExtension_Logs = 'C7_CustUnsubscribe_Logs'; 
 
//Endpoint 
var zeroBounceFullUrl = 'https://api.commerce7.com/v1//customer/CUST_ID'; 
 
//Extract results from Data Extension using DE key 
var results = DataExtension.Init(ZB_DataExtension).Rows.Retrieve(); 
var updateDE_ZB = DataExtension.Init(ZB_DataExtension_Response); 
var logsDE_ZB = DataExtension.Init(ZB_DataExtension_Logs); 
 
var today = Format(Now(), "YYYY-MM-DD "); 
  
for (var i = 0; i < results.length; i++ ) { 
    var item = results[i]; 
    var zeroBounceUrlItem = ""; 
    var ZB_Status = ""; 
    var currentDateTime = Now(); 
    try{ 
        setTimeout(() => (
        zeroBounceUrlItem = String(zeroBounceFullUrl).split("CUST_ID").join(String(item.C7_CustID)); 
 
        
        var req = new Script.Util.HttpRequest(zeroBounceUrlItem); 
        req.emptyContentHandling = 0; 
        req.retries = 3; 
        req.continueOnError = true; 
        req.contentType = "application/json"; 
        req.method = "PUT"; 
        var payload='{"emailMarketingStatus": "Unsubscribed"}'
        req.postData = payload ;
 
        var resp = req.send(); 
        var returnStatus= resp.returnStatus;
        updateDE_ZB.Rows.Update({C7_API_Answer:String(returnStatus),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem),EmailAddress:String(item.EmailAddress)}, ["C7_CustID"], [String(item.C7_CustID)]); 
 
        if (returnStatus==0) { 
updateDE_ZB.Rows.Update({C7_API_Answer:String("Success"),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem),EmailAddress:String(item.EmailAddress)}, ["C7_CustID"], [String(item.C7_CustID)]); 
        } 
        else { 
            //ZB_Status = String("ERRO ZB API Call"); 
            //var responseJson = Platform.Function.ParseJSON(String(resp.content)); 
            updateDE_ZB.Rows.Update({C7_API_Answer:String("Failure"),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem),EmailAddress:String(item.EmailAddress)}, ["C7_CustID"], [String(item.C7_CustID)]); 
        } 
 
var randomID = Platform.Function.GUID();
logsDE_ZB.Rows.Add({log_guid:String(randomID),C7_CustID:String(item.C7_CustID),Status:String("Success"),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem)}); 
    ), 1000*i} 
    catch (err) { 
        var randomID = Platform.Function.GUID(); 
        ZB_Status = String("ERRO AMPScript"); 
        logsDE_ZB.Rows.Add({log_guid:String(randomID),C7_CustID:String(item.C7_CustID),Status:String("Failure"),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem)}); 
    } 
 
} 
</script> 

Your loop will execute the right number of times and at the right interval, but the value of the variable item inside the timeout might not be what you expect. Try this:

for (var i = 0; i < results.length; i++ ) { 
    (function(i){
        setTimeout(function(){
            var item = results[i]; 
            var zeroBounceUrlItem = ""; 
            var ZB_Status = ""; 
            var currentDateTime = Now();  
            try{ 

                zeroBounceUrlItem = String(zeroBounceFullUrl).split("CUST_ID").join(String(item.C7_CustID)); 
 
        
                var req = new Script.Util.HttpRequest(zeroBounceUrlItem); 
                req.emptyContentHandling = 0; 
                req.retries = 3; 
                req.continueOnError = true; 
                req.contentType = "application/json"; 
                req.method = "PUT"; 
                var payload='{"emailMarketingStatus": "Unsubscribed"}'
                req.postData = payload ;
 
                var resp = req.send(); 
                var returnStatus= resp.returnStatus;
                updateDE_ZB.Rows.Update({C7_API_Answer:String(returnStatus),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem),EmailAddress:String(item.EmailAddress)}, ["C7_CustID"], [String(item.C7_CustID)]); 
 
        if (returnStatus==0) { 
updateDE_ZB.Rows.Update({C7_API_Answer:String("Success"),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem),EmailAddress:String(item.EmailAddress)}, ["C7_CustID"], [String(item.C7_CustID)]); 
        } 
        else { 
            //ZB_Status = String("ERRO ZB API Call"); 
            //var responseJson = Platform.Function.ParseJSON(String(resp.content)); 
                    updateDE_ZB.Rows.Update({C7_API_Answer:String("Failure"),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem),EmailAddress:String(item.EmailAddress)}, ["C7_CustID"], [String(item.C7_CustID)]); 
        } 
 
var randomID = Platform.Function.GUID();
logsDE_ZB.Rows.Add({log_guid:String(randomID),C7_CustID:String(item.C7_CustID),Status:String("Success"),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem)});  
    catch (err) { 
        var randomID = Platform.Function.GUID(); 
        ZB_Status = String("ERRO AMPScript"); 
        logsDE_ZB.Rows.Add({log_guid:String(randomID),C7_CustID:String(item.C7_CustID),Status:String("Failure"),ValidationDate:currentDateTime,ValidationUrl:String(zeroBounceUrlItem)}); 
    } 
        }, i*1000);
    })(i);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM