简体   繁体   中英

Javascript Function with Callback and Parameters

I am running into an issue with some basic JS functions when trying to add in a callback that needs to run another function with params.

Here is my email function:

function sendEmail(template, to, cc, bcc, callback, optional=null){

// Define vars needed
var body = '',
    subject = '';

// Based on the template..
switch(template){

    case 'privateNote':

        // Define the subject
        subject = 'Tool Request - Private Note Added';

        // Define our body
        body += 'Hello, <br /><br />';
        body += 'A new private note has been added to Request #' + requestID + '.<br/><br/>';
        body += 'To visit the request, click the following link: <a href="' + window.location.protocol + "//" + window.location.host + "/tool/Request2.php?id=" + requestID + '">' + window.location.protocol + "//" + window.location.host + "/tool/Request2.php?id=" + requestID + '</a>.';
        body += '<br /><br />';
        body += '<em>Message created by ' + userFirst + ' ' + userLast + '</em>';

}

// Send our email
$.ajax({
    url: "../resources/Classes/class.email.php",
    type: "POST",
    cache: false,
    data: {
        from: "noreply@domain.com",
        to: to,
        cc: cc,
        bcc: bcc,
        subject: subject,
        body: body
    },
    error: function(err) {
        alert(err.statusText);
    },
    success: function(data) {
        // Handle Callback
        callFunction(callback);
    }
});
}

// Callbacks
function callFunction(func) {
    func();
}

// Reload the page
function refresh(){
    location.reload('true');
}

This is how I use the function:

sendEmail('privateNote', toArray, '', '', refresh, obj);

This is all working fine as expected, however I am faced with an issue.

There is a section where I need to send out two emails at the same time, one to the people who are added to the request and one to those were removed from that request.

What I tried to do was:

var remove = sendEmail('privateNote', toArray, '', '', refresh, obj);

// Trigger Email to those who are added to the request
// However, I was trying to send a the other email with params as a callback instead of refreshing the page.

sendEmail('privateNote', toArray, '', '', remove, obj);

The problem when doing this is that it seems to be firing both at the same time without waiting for one to finish causing some async issues.

Is there a way to do this correctly? I know this may not be the prettiest way to handles emails but everything has worked fine so far when only having to deal with one email at a time.

This immediately calls the sendEmail() function:

var remove = sendEmail('privateNote', toArray, '', '', refresh, obj);

Since sendEmail() doesn't return anything, remove is undefined .

To make it a proper callback, wrap it in a function() :

var remove = function() {
  sendEmail('privateNote', toArray, '', '', refresh, obj);
}

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