首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将变量从一个回调获取到另一个回调?

如何将变量从一个回调获取到另一个回调?
EN

Stack Overflow用户
提问于 2014-12-05 14:24:51
回答 2查看 230关注 0票数 1

好的,假设我有两个带有回调的侦听器,其中一个回调中的代码依赖于另一个回调中的变量(UIDfromOnEndFunction)。

例如:

代码语言:javascript
复制
//using andris9/mailparser on github

var mailparser = new MailParser({
    streamAttachments: true
}

// OnEnd Function
mailparser.on("end", function(objMail){
    **UIDfromOnEndFuntion** = objMail.UID;

    saveToDB("mail" + "1234", objMail);
});


mailparser.on("attachment", function(attachment){
    var output = fs.createWriteStream("attachments/"
        + **UIDfromOnEndFuntion** + "/" + attachment.generatedFileName);
        // need UIDfromOnEndFunction here

    attachment.stream.pipe(output);
});

如何使mailparser.on("attachment"中的回调获取变量UIDfromOnEndFunction

这涉及到承诺吗?您如何做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2014-12-05 14:30:10

你可以通过闭包来做到这一点:只需从外部访问一个变量。

代码语言:javascript
复制
//using andris9/mailparser on github
var UIDfromOnEndFunction;

var mailparser = new MailParser({
    streamAttachments: true
}

// OnEnd Function
mailparser.on("end", function(objMail){
    UIDfromOnEndFuntion = objMail.UID;

    saveToDB("mail" + "1234", objMail);
});


mailparser.on("attachment", function(attachment){
    var output = fs.createWriteStream("attachments/" + UIDfromOnEndFuntion + "/" + attachment.generatedFileName);

    attachment.stream.pipe(output);
});

请注意我关于确保在attachment之前调用end的评论。如果他们不以这种方式触发,这从根本上是不可能的。

票数 0
EN

Stack Overflow用户

发布于 2014-12-06 18:03:23

好的,我想出了一个解决方案。它基于@Brenden Ashworth的建议中的闭包。它未经测试,但我相当确定它会工作,我想在我继续之前发布这篇文章,因为我发现我不需要做原始问题描述的事情来让我的项目工作。

然而,我仍然认为对于这种类型的问题有一个解决方案是有用的,因为可能会出现需求,而我不知道更好的解决方案。

这是我的解决方案:

代码语言:javascript
复制
//using andris9/mailparser on github

var mailparser = new MailParser({
    streamAttachments: true
}

var UIDfromOnEndFuntion;
var myAttachment;
var intNumberOfEmitsToEndAndAttachment = 0;


var funcBothEndAndAttachmentEmitted = function () {
    var output = fs.createWriteStream("attachments/"
        + UIDfromOnEndFuntion + "/" + myAttachment.generatedFileName);
            //UIDfromEndFunction should be garaunteed to be
            //populated by .once("end",...)

    myAttachment.stream.pipe(output);
        //myAttachment should be gauranteed to be populated
        //by .once("attachment",...)
}

mailparser.once("end", function(objMail){
    UIDfromOnEndFuntion = objMail.UID;

    saveToDB("mail" + "1234", objMail);

    intNumberOfEmitsToEndAndAttachment++;
    if (intNumberOfEmitsToEndAndAttachment == 2) {
        funcBothEndAndAttachmentEmitted();
    }
});


mailparser.once("attachment", function(attachment){
    myAttachment = attachment;

    intNumberOfEmitsToEndAndAttachment++;
    if (intNumberOfEmitsToEndAndAttachment == 2) {
        funcBothEndAndAttachmentEmitted();
    }
});

现在,这将仅适用于单个发射的"end“和单个发射的”附件“。

你可以更有创意地跟踪如何处理多个附件。例如,可以使用像[{"attachment",attachment_args1},{"attachment",attachment_args2},{"end",end_args2}]这样的对象数组来跟踪调用,而不是使用整数来跟踪调用(这意味着到目前为止,attachment已经被调用了两次,"end"被调用了一次,您可以基于该知识触发一个函数,就像我通过调用funcBothEndAndAttachmentEmitted()所做的那样)。

我认为这需要清理并制作成一个库,除非有更好的方法来做它,这是不明显的。(如果您知道更好的解决方案,请发表评论,否则我可能会继续为此解决方案编写一个库。)

我想到的另一个可能可行的解决方案是将mailparser.once("attachment"...)放在mailparser.once("end"...)的回调中,但我怀疑如果首先发出"attachment"就不会起作用,如果你出于某种原因处理许多不同的发出事件,或者不同的对象发出不同的事件,那么与基于库的解决方案相比,这个解决方案似乎有点复杂。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27310038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档