Javascript 是否可以在等待事件侦听器时停止函数的执行?

Javascript 是否可以在等待事件侦听器时停止函数的执行?,javascript,Javascript,我使用gmail.js库编写了这个函数,它从事件侦听器接收返回的字符串,我希望在发送电子邮件之前将该字符串注入邮件正文。在等待事件侦听器从外部脚本获得响应时,如何让函数停止执行?我有一种感觉,它可以通过同步回调来完成,但我不知道如何去做。在这件事上,如果有任何帮助,我将不胜感激 gmail.observe.before('send_message', function(url, body, data, xhr) { console.log('In the before send message

我使用gmail.js库编写了这个函数,它从事件侦听器接收返回的字符串,我希望在发送电子邮件之前将该字符串注入邮件正文。在等待事件侦听器从外部脚本获得响应时,如何让函数停止执行?我有一种感觉,它可以通过同步回调来完成,但我不知道如何去做。在这件事上,如果有任何帮助,我将不胜感激

gmail.observe.before('send_message', function(url, body, data, xhr) {

console.log('In the before send message method');

var event = new CustomEvent('Marketing', {

    detail: {
        body: xhr.xhrParams.body_params.body,
        email: gmail.get.user_email()
    }
});

window.addEventListener('message', function(event) {
if (event.data.type && (event.data.type == "FROM_PAGE")) {
    console.log("received a reply");
    console.log(event.data.text);
    newstring = (event.data.candidate);
    console.log(newstring);
    console.log(event.data.token);
    gotNewString = true;
}
});


window.dispatchEvent(event);
console.log('sent the message to extension.js');
function listen(data){
    console.log("123123",JSON.stringify(data));
    console.log(data);
}

newstring = "Why must you torture me so?";

var oldCmml = xhr.xhrParams.url.cmml;

var body_params = xhr.xhrParams.body_params;

if (newstring.length > oldCmml) {
    xhr.xhrParams.url.cmml = newstring.length;
} else {
    while (newstring.length < oldCmml) {
        newstring += ' ';
    }
    xhr.xhrParams.url.cmml = newstring.length;
}
console.log(newstring);
body_params.body = newstring;

console.log("sent");

});
gmail.observe.before('send_message',函数(url、正文、数据、xhr){ log('In the before send message method'); var事件=新的CustomEvent('营销'{ 详情:{ body:xhr.xhrParams.body_params.body, 电子邮件:gmail.get.user_email() } }); window.addEventListener('message',函数(事件){ if(event.data.type&&(event.data.type==“来自页面”)){ log(“收到回复”); 日志(event.data.text); newstring=(event.data.candidate); console.log(新闻字符串); 日志(event.data.token); gotNewString=true; } }); 窗口。dispatchEvent(事件); log('将消息发送到extension.js'); 函数侦听(数据){ log(“123123”,JSON.stringify(data)); 控制台日志(数据); } newstring=“你为什么要这样折磨我?”; var oldcml=xhr.xhrParams.url.cmml; var body_params=xhr.xhrParams.body_params; 如果(newstring.length>oldcml){ xhr.xhrParams.url.cmml=newstring.length; }否则{ while(newstring.length您不能在回调中停止函数的执行。您必须更改调用函数的代码,以等待函数完成。这通常是通过提供回调函数来完成的,在完成处理后,您必须调用回调函数,例如:

gmail.observe.before('send_message', function(url, body, data, xhr, done) {
    // you can do processing here

    // and have to call done, to let the caller continue his work
    done();
});

对于监听器来说,这显然是正常情况下不提供的,但由于gmail.js是开源的,您可以更改它?

我认为您可能希望消息事件触发发送,而不是相反的方式…我希望我可以这样做,不幸的是,
observe.before
是按下发送按钮时发生的API调用,这是执行此代码的其他方法,因此我必须从内部暂停函数,但您不能这样做。即使可以使用循环冻结所有内容,也可以防止消息事件触发。如果您可以取消之前的事件,那么您可以稍后调用
gmail.observe.trigger
,使用与已取消事件相同(或几乎相同)的值“resume”。