Как успешно выполнить обратный вызов для асинхронного метода - PullRequest
0 голосов
/ 09 мая 2019

Я сейчас пытаюсь вернуть значение из функции, которая содержит асинхронную функцию, и я застрял.

В настоящее время я работаю с SharePoint 2013 JSOM, чтобы извлечь адрес электронной почты из столбца Person. Я нашел хорошую функцию, которая делает это, и я решил передать userID в функцию.

Сама функция содержит console.log и выводит ожидаемый результат, однако мне нужны те результаты, откуда я сначала вызвал функцию, поэтому я обнаружил, что мне нужно использовать обратный вызов. Я не могу извлечь переменную из вызывающего метода.

    var t = oListItem.get_item('ElementContactFullName').get_lookupId();
    var q = getEmail(t, function(returnedValue){});
    function getEmail(userId, callback) {

    var x = [];
    var context = new SP.ClientContext();
    var web = context.get_web();
    var user = web.get_siteUsers().getById(userId);
    context.load(user);

    context.executeQueryAsync(function() {
        //console.log(user.get_email());
        var y = user.get_email();
        x.push(y);

    }


    , function() {
        console.log("error");

    });

    callback(x);
    }

Я хочу, чтобы q равнялся адресу электронной почты, чтобы я мог использовать его в другом месте вызывающей функции.

То, что я получаю, является «неопределенным», независимо от того, что я пытаюсь.

Я могу поместить console.log в функцию (returnValue) {}), но это все еще не позволяет мне получить переменную. Не сделано достаточно JScript, чтобы понять очень сложные предположения о предложенном дубликате.

1 Ответ

0 голосов
/ 14 мая 2019
function getEUEmail(userId, JT,  flag, callback) {

    var x = [];

    var contextEU = new SP.ClientContext();

    var web = contextEU.get_web();

    var user = web.get_siteUsers().getById(userId);

    contextEU.load(user);

    contextEU.executeQueryAsync(function() {

        //console.log(user.get_email());

        var y =   "<div class='tablewrapper'>" +
      "<div class='table'>" +
        "<div class='row'>" +
          "<div class='rowspanned cell'>" +
             ' <img class="contacts" src="' + _spPageContextInfo.webServerRelativeUrl + '/_layouts/15/userphoto.aspx?size=M&accountname='+ user.get_email()  +'"/>' +
          "</div>" +
          "<div class='cell'>" +
           user.get_title() +
          "</div>" +
        "</div>" +
        "<div class='row'>" +
          "<div class='empty cell'></div>" +
          "<div class='cell'>" +
            JT +  
          "<div class='cell'>" +
         ' <img class="flag" src="' + window.location.protocol + "//" + window.location.host   + '/SiteAssets/Images/'+ flag  +'.png"/>' +
         //http://staging.intranet.ent.sys.element.com/SiteAssets/Images/EU.png
          "</div>" +
        "</div>" +
        "</div>" +
      "</div>" +
    "</div>"

        x.push(y);

        callback(x);
}

Затем, чтобы использовать его

       getEUEmail(t,u, v, function(returnedValueEU) {

            //console.log(returnedValue[0])

            $("#divListItemsEU").append(

            "<style type='text/css'> .tablewrapper { position: relative;  box-sizing: border-box; height:72px} .table {display: table; } .row { display: table-row; padding: 1px; } .cell { display: table-cell; border: none solid red; padding: 3px;} .cell.empty { border: none; width: 75px; } .cell.rowspanned {  position: absolute; top: 0;  bottom: 0; width: 75px; display: block; margin: 1px;} .contacts{ width: 72px; height: 72px;} .flag { width: 30px; height: 20px; }</style> " +

                    "" + returnedValueEU[0]  + 




                    '<br />');
});

    $("#divListItemsEU").html(listEUItemInfoEU);

}

В итоге я передал все значения в функцию getEmail, построил HTML, а затем разработал, как использовать обратный вызов с некоторой помощью.Вероятно, не правильно, эффективно или элегантно, но это работает.Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...