Ошибка Office365 "addFileAttachmentAsync" при выполнении нескольких запросов

У меня возникла проблема с addFileAttachmentAsync. У меня есть 2 массива: внедренные файлы (содержит имена файлов, которые будут прикреплены к телу) и вложения (содержит имена файлов, которые будут прикрепляться). У меня есть 2 цикла for для каждого массива, и они должны сделать GET-запрос к Exchange Server с каждым файлом массива и вернуть двоичный файл.

          for (var i = 0; i < embeddedFiles.length; i++) {
                            var attachmentName = (new Date()).getTime() + ".png";
                            var count = 0;
                            var options = { isInline: true, ContentId: attachmentName, asyncContext: { UniqueName: attachmentName } };
                            var attachmentURL = "http://" + document.location.hostname + document.location.port + '/MailForms/api/GetAttachment?' + 'AttId=' + embeddedFiles[i] + '&' + 'MwToken=' + token + '&' + 'ReqId=' + data.ReqId + '&' + 'userSmtp=' + smtp;
                            Office.context.mailbox.item.addFileAttachmentAsync(
                                attachmentURL,
                                attachmentName,
                                options,

                                function (asyncResult) {
                                    if (asyncResult.status == Office.AsyncResultStatus.Failed) {
                                        app.showNotification('Failed to add attachment', asyncResult.error.message);
                                    }
                                    else {

                                        var szCID = asyncResult.asyncContext.UniqueName;
                                        //var szAddBodyData = "<br><div><img height=150 width=150 src='cid:" + szCID + "'></div><br>"
                                        var bizimCigid = "cid:" + szCID;
                                        var index = "" + count;
                                        var oldsource = oBody.find('.mw-images')[index].attributes[1].value;
                                        oldsource = bizimCigid;
                                        //imagesource.replaceWith(bizimCigid);
                                        //Office.context.mailbox.item.body.setSelectedDataAsync(szAddBodyData, { coercionType: Office.CoercionType.Html });
                                        oBody.find('.mw-images')[index].attributes[1].value = oldsource;
                                        //Office.context.mailbox.item.body.setSelectedDataAsync({ coercionType: Office.CoercionType.Html });

                                        viewModel.updateComposeFormLast(subject, oBody["0"].innerHTML);
                                        count = count +  1;
                                    }


                                }


                            );

    for (var i = 0; i < attachments.length; i++) {

                            var attachmentURL = "http://" + document.location.hostname + document.location.port + '/MailForms/api/GetAttachment?' + 'AttId=' + attachments[i] + '&' + 'MwToken=' + token + '&' + 'ReqId=' + data.ReqId + '&' + 'userSmtp=' + smtp;

                            Office.context.mailbox.item.addFileAttachmentAsync(
                                attachmentURL,
                                attachments[i],
                                {
                                    'asyncContext': {}
                                },
                                viewModel.getAttachmentsContent
                                );
                        }

Приведенный выше код принимает строку запроса и вызывает метод addFileAttachmentAsync. Там нет ничего плохого в URL. Я попробовал их в браузере, и они действительно получают файл на основе пользовательского URL. getAttachmentsContent - это метод, который вызывает только console.log("бла").

Он прекрасно работает, когда добавить одно вложение или встроенное изображение. Но мне нужно добавить несколько вложений и несколько встроенных изображений. Вот что я пробовал:

  1. Просто добавление одного вложения - работает
  2. Просто добавив одно встроенное изображение - работает
  3. Добавление изображения и вложения - работает, но медленно
  4. Несколько вложений и встроенных изображений - не работает.

Ошибка, которую я получаю:

    error OSF.DDA.Error code 9002 message "There was an internal format error." name : "InternalFormatError"*

Мне кажется, когда вы делаете несколько запросов в одном формате, он ломается. Но я не уверен почему.

Есть идеи?

1 ответ

Решение

@ Намиг Исмайлов, addFileAttachmentAsync метод асинхронный.

Итак, чтобы вызвать несколько асинхронных вызовов, вот ваши варианты:

  1. использование Promises: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
  2. Используйте вызовы вложенных функций, вызывая следующий асинхронный метод внутри обратного вызова предыдущего.
  3. Используйте рекурсию, с вложенными вызовами. Это просто продолжение пункта 2 выше.

Для вашего случая, например, вот способ прикрепить несколько файлов с помощью рекурсии. Вызывающий должен просто вызвать метод my_add_file_attachments_recursively()

function my_add_file_attachments_recursively_helper(file_attachment_arr, index, message)
{
    if (index < file_attachment_arr.length)
    {
        var file_attachment_obj = file_attachment_arr[index];

        Office.context.mailbox.item.addFileAttachmentAsync
        (
            file_attachment_obj.url,
            file_attachment_obj.name,
            {
                "asyncContext" :
                {
                    "message" : message,
                    "index" : index
                }
            },
            function (asyncResult)
            {
                var next_message = asyncResult.asyncContext.message + "id : " + asyncResult.value + " , " + "status : " + asyncResult.status + "\n";

                // add the next attachment here, recursively
                my_add_file_attachments_recursively_helper(file_attachment_arr, asyncResult.asyncContext.index + 1, next_message);
            }
        );
    }
    else
    {
        console.log(message);
    }
}

function my_add_file_attachments_recursively()
{
    var file_attachments_arr =
    [
        {
            "name" : "gold_puppy.jpg",
            "url" : "https://foo/gold_puppy.jpg"
        },
        {
            "name" : "black_puppy.jpg",
            "url" : "https://foo/black_puppy.jpg"
        },
        {
            "name" : "white_puppy.jpg",
            "url" : "https://foo/white_puppy.jpg"
        }
    ];

    my_add_file_attachments_recursively_helper(file_attachments_arr, 0, "");
}
Другие вопросы по тегам