javascript - 具有回调数组的 JS 函数

标签 javascript callback

我正在尝试找出创建具有多个回调的函数的最佳方法。

简而言之,我在整个应用程序中拥有不同的触发器,这些触发器可以在执行关键操作时(例如当票证关闭或已向其分配成员时)发送电子邮件。棘手的部分是,有时需要同时发出多封不同的电子邮件。

这是我的电子邮件功能:

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

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

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

    case 'updatedTask':

        // Define the subject
        subject = 'Tool Request - Updated Task';

        // Define our body
        body += 'Hello, <br /><br />';
        body += 'Blah Blah';
        body += 'Footer';

    break;
    case 'removedTaskOwner':

        // Define the subject
        subject = 'Tool Request - Removed Task Owner';

        // Define our body
        body += 'Hello, <br /><br />';
        body += 'Blah Blah';
        body += 'Footer';

    break;
    case 'completedTask':

        // Define the subject
        subject = 'Tool Request - Completed Task';

        // Define our body
        body += 'Hello, <br /><br />';
        body += 'Blah Blah';
        body += 'Footer';

    break;
}


// 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');
}

这是我目前使用该功能的方式:

 // Once the email is sent, it triggers a function called refresh
 sendEmail('taskUpdated', toArray, '', '', refresh, ''); 

这就是我正在尝试做的事情:

// Define our remove function as a callback
var remove = function() {
 sendEmail('removeTaskOwner', toArray, '', '', refresh, '');
}

// Define our completed function as a callback
var completed = function() {
  sendEmail('completedTask', toArray, '', '', refresh, '');
}

// If there is a completed date, we need to send out two separate emails
var callbacks = Array();
if(completionDate){
  callbacks.push('completed', 'remove');
}else{
  callbacks.push('remove');
}

sendEmail('taskUpdated', toArray, '', '', callbacks, ''); 

我遇到的问题是,callbacks 似乎不能是回调函数数组。

我想要做的总体所需功能是能够传递多个模板收件人并在电子邮件末尾触发最终功能发送出去,比如页面刷新。

最佳答案

您可以使用 Promise。 jQuery 已经内置了这个功能。 $.ajax 返回一个 promise 。

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

    // etc..

    // return here!
    return $.ajax({
        url: "../resources/Classes/class.email.php",
        type: "POST",
        cache: false,
        data: {/*etc*/}
    });
}

然后你可以这样做:

var remove = function() {
    sendEmail('removeTaskOwner', toArray, '', '', '' ).done(refresh);
}

// Define our completed function as a callback
var completed = function() {
    sendEmail('completedTask', toArray, '', '', '').done(refresh);
}

sendEmail("taskUpdated", toArray, "" , "").done(function () {
    if(completionDate){
        completed();
    }
    remove();
}).fail(function (err) {
    alert(err.statusText);
});

关于javascript - 具有回调数组的 JS 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33809607/

相关文章:

javascript - Angular Bootstrap 模式不返回父窗口

javascript - IE8/IE7/IE6 似乎将通过 JQuery 插入的 anchor 标记视为 block 级元素

javascript - Aurelia 验证 - 在 aurelia-validation@0.9.2 中替换 isValid

javascript - Controller 内部 undefined variable ($scope 问题)

javascript - 在for循环中解析查询(回调)

javascript - 将参数传递给 elasticsearch javascript api 搜索请求的回调函数

javascript - 异步 js 函数和日志记录错误

java - 如何添加回调以将文本附加到 TextArea 或执行解析的类中的其他内容?

javascript - 在ios中通过javascript设置输入类型="datetime"

javascript - 悬停样式