моя функция syn c не ждет завершения всех подфункций - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь создать API, который может видеть, сделал ли я пост на imgur и действительно ли я близок к фини sh, но моя функция возвращается до конца

exports.handler = ( event, context, callback) => {

ddb.scan(params1, function(err, data) {
    if (err) callback(null, err);
    else {
        data.Items.forEach(function(item) {
            for (var o = 0; item.links && item.links.L && o < item.links.L.length; o++) {
                var taction = "";
                var treaction = "";
                var action = item.links.L[o].S.substring(0, item.links.L[o].S.indexOf(' '));
                var saction = action.substring(0, action.indexOf(':'));
                var reaction = item.links.L[o].S.substring(item.links.L[o].S.indexOf('=')+2);
                var sreaction = reaction.substring(0, reaction.indexOf(':'));
                for (var z = 0; item.accsplus && item.accsplus.L && z < item.accsplus.L.length; z++) {
                    if (item.accsplus.L[z].S.substring(0, item.accsplus.L[z].S.indexOf(':')) == saction) 
                        taction = item.accsplus.L[z].S.substring(item.accsplus.L[z].S.indexOf('token:')+6);
                    if (item.accsplus.L[z].S.substring(0, item.accsplus.L[z].S.indexOf(':')) == sreaction)
                        treaction = item.accsplus.L[z].S.substring(item.accsplus.L[z].S.indexOf('token:')+6);
                }
                if (taction == "" || treaction == "") log += "no token for this service @" +action+reaction + " ";
                else{
                    console.log("testing " +action+reaction)
                    if ((saction == "imgur" || saction == "reddit") && (sreaction == "imgur" || sreaction == "reddit")) {
                        if (saction == "imgur")
                            imgur(action.substring(action.indexOf(':')+1), item, taction, reaction.substring(reaction.indexOf(':')+1));
                    }
                }
            }
        })
        callback(null, "ok");
    }
});

async function imgur(action, whom, token, reaction) {
    if (action =="") return;
    var requestdone = false;
    var toret;
    var old = "";
    var needed = action;
    if (action == "onpost" || action == "onrem") needed = "postnbr";
    if (action == "onlike" || action == "ondis") needed = "likenbr";
    console.log("imgur " + needed);
    var myHeaders = new Headers();
    myHeaders.append("Authorization", "Bearer " + token);
    var requestOptions = {
        method: 'GET',
        headers: myHeaders,
        redirect: 'follow'
    };
    async function request(success) {
        const response = await fetch("https://api.imgur.com/3/account/me/images", requestOptions)
        const json = await response.json();
        return await success(json);;
    }
    function success(json) {
        var worked;
        if (needed == "postnbr") actual = (json.data.length);   
        if (needed == "likenbr"){
            if (json.data[0].vote == null || json.data[0].vote == "null") actual =  (0);
            actual = (json.data[0].vote);   
        }
        if (needed == "postnbr") console.log("postnbr = " + actual);
        if (needed == "likenbr") console.log("likenbr = " + actual);
        if (whom.old && whom.old.L && whom.old.L.length > 0){
            for (var p = 0; old == "" && p < whom.old.L.length; p++){
                if (whom.old.L[p].S.substring(0,whom.old.L[p].S.indexOf(':')) == "imgur"+needed)
                {
                    old = whom.old.L[p].S.substring(whom.old.L[p].S.indexOf(':')+1);
                    if (action == "onpost" && old < actual) worked = true;
                    if (action == "onrem" && old > actual) worked = true;
                    if (action == "onlike" && old < actual) worked = true;
                    if (action == "ondis" && old > actual) worked = true;
                }
            }
        }
        if (worked)
        {
            return imgur(reaction, whom, token, "");
        }
        upold("imgur", needed, whom, actual)
    }
    await request(success)
}

var getactual = function(service, token, needed) {
    return new Promise(function(resolve, reject){
        if (service == "imgur"){

        }
        if (service == "reddit"){
            console.log("do reddit mofo");
        }
    })
};

function upold(service, needed, whom, actual) {
    var toret = [];
    if (whom.old && whom.old.L.length > 0){
        for (var m = 0; m < whom.old.L.length ; m++) {
            if (whom.old.L[m].S.substring(0,whom.old.L[m].S.indexOf(':')) != service+needed)toret.push(whom.old.L[m].S);
        }
    }
    toret.push(service+needed + ":" +actual);
    param = {
        TableName:"biipboop",
        Key:{
            "email": whom.email.S
        },
        UpdateExpression: "set old=:r",
        ExpressionAttributeValues:{
            ":r":toret
        },
        ReturnValues:"UPDATED_NEW"
    };
    docClient.update(param, function() {});
}

};

пока что похоже, что функция работает и вызывается подфункция request, но main не ждет ответа и возвращает Promise {}, после чего журнал действительно появляется после успешного завершения, но у меня нет моей переменной в конце функции imgur, он просто регистрирует себя после завершения

EDITED: так как вы запросили фактический код, который я имел, я копирую и грубо вставляю его, у меня хорошо работает сканирование, получает весь мой пользователь, а затем он не ждет, пока функция «imgur» даст правильный ответ, а просто оставляет триггеры и выполняет итерацию по каждому элементу foreach.

я пытаюсь использовать лямбду и дб через aws

журналы поступают в следующем порядке: testing imgur:onpostimgur:onlike imgur postnbr testing reddit:postreddit:onpost postnbr = 3

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Ну imgur() возвращает обещание. Таким образом,

console.log(imgur("onpost", accounts[i], accounts[i].token))

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

return("you made a post recently");

, у него его еще не будет, поскольку обещания никогда не разрешаются синхронно. Самое быстрое обещание, что возврат imgur() будет решен, будет на следующем тике события l oop, которое следует за вашим console.log().


Вы можете изменить код на это, чтобы войти значение:

async function main(accounts) {
   for (var i = accounts.length - 1; i >= 0; i--) {
     let val = await imgur("onpost", accounts[i], accounts[i].token);
     console.log(val);
   }
}

Имейте в виду, что некоторые пути кода через imgur() не возвращают значение, которое, вероятно, не является желаемым дизайном, поэтому иногда разрешенное значение из обещания imgur() может быть undefined а иногда нет.

0 голосов
/ 29 февраля 2020

То, как вы возвращаете данные из imgur, мне действительно не нравится. На мой взгляд, было бы намного проще, если бы вы превратили imgur в функцию async, чтобы вы могли await для данных, которые request возвращает.

async function imgur(action, whom, token) {
    var toret;
    var old = "";
    var needed = "postnbr";

    var myHeaders = new Headers();
    myHeaders.append("Authorization", "Bearer " + token);
    var requestOptions = {
        method: 'GET',
        headers: myHeaders,
        redirect: 'follow'
    };
    async function request(success) {
        const response = await fetch("https://api.imgur.com/3/account/me/images", requestOptions)
        const json = await response.json();
        return /* await */ success(json); // <-- shouldn't have to await this
    }
    function success(json) {
        old = "2";
        if (needed == "postnbr") actual = (json.data.length);   
        if (needed == "postnbr") console.log("postnbr = " + actual);
        if (action == "onpost" && old < actual)                     
            return("you made a post recently");
        updateold("imgur", needed, whom, actual)
    }
    return await request(success); // .then(function(msg) {return msg;});
}

Затем вы можете использовать его как:

async function useImgur() {
  const imgurData = await imgur('some-action', 'some-whom', 'some-token');
  console.log(imgurData);
}

useImgur();

... или как:

imgur('some-action', 'some-whom', 'some-token')
  .then(imgurData => console.log(imgurData))
  .catch(err => console.error(err));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...