Возвращаемое значение с карты не определено - PullRequest
0 голосов
/ 26 июня 2018

У меня есть данные, которые выглядят примерно так:

[ 
  {  ItemID: 1,  Path: '/Admin',     Name: 'Admin'   },
  {  ItemID: 2,  Path: '/Product',   Name: 'Product' },
  {  ItemID: 3,  Path: '/Reports',   Name: 'Reports' } 
]

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

Это то, что я имею до сих пор:

const result = data
    .map(curr => {

        // Map over the object and check the names of the object
        // create a new key `groupName` if matched

        if (curr.Name == "Admin") {
            let groupName = "Admin Access";
            return { ...curr, groupName: groupName };
        } else if (curr.Name == "Product") {
            let groupName = "Product Access";
            return { ...curr, groupName: groupName };
        } else if (curr.Name == "Reports") {
            let groupName = "Reports";
            return { ...curr, groupName: groupName };
        }
    })
    .map(obj => {
// obj now looks like this
//{ ItemID: 1, Path: '/Admin',  Name: 'Admin',   groupName: 'Admin Access' }
//{ ItemID: 2, Path: '/Product',Name: 'Product', groupName: 'Product Access'}
//{ ItemID: 3, Path: '/Reports',Name: 'Reports', groupName: 'Reports' }

        // Map over the object and check permissions for access

        let enabled = checkInGroup(username, obj.groupName)
        .then(function(isMember) {
            if (isMember) {
                return obj; //isMember will return true or false
            }
        });
        return obj == enabled; //if enabled then add to return object
    });

console.log("===> result ", result);

Ожидаемый результат: (при условии, что пользователь не может получить доступ к Admin)

[ 
  {  ItemID: 2,  Path: '/Product',   Name: 'Product' },
  {  ItemID: 1,  Path: '/Reports',   Name: 'Reports' } 
]

РЕДАКТИРОВАТЬ: ДОБАВИТЬ CheckInGroup Функция

function checkInGroup(username, groupName) {
    return new Promise(function(resolve, reject) {
        ad.isUserMemberOf(username, groupName, function(err, isMember) {
            if (err) {
                return res.json("Error ", err);
            }
            resolve(isMember);
        });
    });
}

1 Ответ

0 голосов
/ 26 июня 2018

.then() всегда возвращает обещание, поэтому obj === enabled не будет работать. Вы не можете сделать асинхронный код синхронным. Когда у вас есть функция, которая является асинхронной, каждый вызывающий в цепочке должен иметь возможность справиться с этим.

Вы можете получить список обещаний и подождать, пока все они не будут решены, а затем отфильтровать недействительные:

const promises = data
    .map(curr => {

        // Map over the object and check the names of the object
        // create a new key `groupName` if matched

        if (curr.Name == "Admin") {
            let groupName = "Admin Access";
            return { ...curr, groupName: groupName };
        } else if (curr.Name == "Product") {
            let groupName = "Product Access";
            return { ...curr, groupName: groupName };
        } else if (curr.Name == "Reports") {
            let groupName = "Reports";
            return { ...curr, groupName: groupName };
        }
    })
    .map(obj => {
        // Map over the object and check permissions for access
        return checkInGroup(username, obj.groupName)
        .then(function(isMember) {
            obj.enabled = isMember;
            return obj;
        });
    });

Promise.all(promises).then(result => {
  console.log(result.filter(obj => obj.enabled));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...