好的,假设我有两个带有回调的侦听器,其中一个回调中的代码依赖于另一个回调中的变量(UIDfromOnEndFunction)。
例如:
//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。
这涉及到承诺吗?您如何做到这一点?
发布于 2014-12-05 14:30:10
你可以通过闭包来做到这一点:只需从外部访问一个变量。
//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的评论。如果他们不以这种方式触发,这从根本上是不可能的。
发布于 2014-12-06 18:03:23
好的,我想出了一个解决方案。它基于@Brenden Ashworth的建议中的闭包。它未经测试,但我相当确定它会工作,我想在我继续之前发布这篇文章,因为我发现我不需要做原始问题描述的事情来让我的项目工作。
然而,我仍然认为对于这种类型的问题有一个解决方案是有用的,因为可能会出现需求,而我不知道更好的解决方案。
这是我的解决方案:
//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"就不会起作用,如果你出于某种原因处理许多不同的发出事件,或者不同的对象发出不同的事件,那么与基于库的解决方案相比,这个解决方案似乎有点复杂。
https://stackoverflow.com/questions/27310038
复制相似问题