【发布时间】:2016-12-14 05:36:37
【问题描述】:
我有一个生成电子邮件的 javascript 函数。
如果电子邮件有附件,我会循环浏览这些附件,并且每次将一个附件上传到 Dropbox,而不是实际附加附件,而是在电子邮件正文中附加一个指向该文件的 Dropbox 链接。
(相关代码用反斜杠包裹)
self.email = function (action, contact) {
var emailTo = contact.email();
var attachment = "";
var lineBreak = "%0D%0A";
var signature = uvm.user().fullName()
var body;
var dropboxLink = "";
switch (action) {
case "a":
body = "aaaa";
break;
case "b": case "c":
body "bbbccc";
break;
//////////The piece of code that I'm working on//////////
default:
$.each(self.checkedDocs(), function (key, doc) {
self.service.getDropboxLink(doc, function (result) {
dropboxLink = result;
attachment += lineBreak + doc.documentDescription() + ": " + dropboxLink;
});
});
body = "Please click on the link(s) below to view your document(s): "
//////////End//////////
}
attachment = attachment ? attachment + lineBreak + lineBreak : lineBreak;
body += lineBreak + attachment + signature;
window.location.href = "mailto:" + emailTo + "?subject=" + self.subject() + "&body=" + body;
}
这是getDropboxLink函数:
self.getDropboxLink = function (doc, callback) {
$.ajax({
url: "/API/dropbox/DropboxUpload",
type: "POST",
data: ko.toJSON(doc),
contentType: "application/json",
success: function (data) {
callback(data);
}
});
}
此代码无法正常工作,如果案例为default 并且有电子邮件附件,则电子邮件是在在我从 API 获取 Dropbox 链接之前生成的。
我可以将async=false 添加到 POST 请求中,这样可以解决问题,但不推荐使用 async=false。
我认为我应该使用回调或承诺来执行此操作,但这很复杂,因为生成电子邮件的代码部分属于 switch 的所有 cases 并且对 API 的调用仅在default 部分。
如果action 是default 我需要:
attachment = attachment ? attachment + lineBreak + lineBreak : lineBreak;
body += lineBreak + attachment + signature;
window.location.href = "mailto:" + emailTo + "?subject=" + self.subject() + "&body=" + body;
完成后发生:
$.each(self.checkedDocs(), function (key, doc) {
self.service.getDropboxLink(doc, function (result) {
dropboxLink = result;
attachment += lineBreak + doc.documentDescription() + ": " + dropboxLink;
});
});
如果操作是 a 或 b 或 c 没关系。
我希望我很清楚。有什么建议吗?
非常感谢任何帮助。
【问题讨论】:
-
异步的东西是虚拟的,一旦你的代码中有一个异步请求,整个调用链也必须是异步的。也就是说,你的功能应该像
getDropBoxLinks().then(formatEmail).then(sendEmail) -
谢谢你,我很想用一个承诺来做,你能指导我多一点吗?
标签: javascript asynchronous callback promise