Как сделать последовательным, если операторы асинхронны в JavaScript? - PullRequest
1 голос
/ 01 июля 2019

У меня есть серия операторов if в цикле, подобном следующему:

for( var i = 0; i < results_list.length; i++){
find = await results_list[i];    
    //result 1
    if (find.Process == "one") {
        await stored_proc(38, find.Num, find.Status)
    }
    //result 2
    if(find.Process == "two") {
        await stored_proc(37, find.Num, find.Status)
    }
    //result 3
    if(find.Process == "three") {
        await stored_proc(39, find.Num, find.Status)
    }
}

Моя проблема заключается в том, что он выполняет все эти синхронно, вызывая отключение моей хранимой процедуры.Как я могу убедиться, что каждый оператор if ожидает выполнения предыдущего до выполнения?

Также важно знать, что каждый оператор if не всегда выполняется, например, при одном запуске моего кода //result 2 может выполняться, а //result 1 и //result 3 может не выполняться.

Иногда все они могут работать, а иногда и вовсе не запускаться.

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Вот моя функция хранимой процедуры

async function stored_proc(opID, num, stat){
         sql.executeTransaction( connection, {
            procedure: "<stored procedure>",
            params: { 
                OpID: {
                    val: opID,
                    type: sql.INT
                },
                num: {
                    val: num,
                    type: sql.STRING
                },
                Pass: {
                    val: stat,
                    type: sql.INT
                },
                ExtraData: {
                    val: "upload",
                    type: sql.STRING
                }
            }
        } ).then( async function( data ) {
            return data.transaction
                .commit()
                .then( async function() {
                    console.log("Updated database...." );
                } );
        }, function( err ) {
            console.log( err );
        } );
    }

ВТОРОЕ РЕДАКТИРОВАНИЕ: Я рассмотрел это еще несколько раз и обнаружил, что если для его загрузки имеется более одного результата, он НИКОГДА не загрузит первые наборыРезультаты.Я пробежал несколько console.log() s и обнаружил, что он всегда получит find.Num и find.Status.Он будет регистрировать только Updated database для каждого результата после первого.Я надеюсь, что это имеет смысл

1 Ответ

2 голосов
/ 01 июля 2019

В вашем stored_proc вы не возвращаете обещание.
Кроме того, обещание внутри обещания считается анти-паттерном, вы можете легко его зацепить.

async function stored_proc(opID, num, stat) {
    return sql.executeTransaction(connection, {
        procedure: "<stored procedure>",
        params: {
            OpID: {
                val: opID,
                type: sql.INT
            },
            num: {
                val: num,
                type: sql.STRING
            },
            Pass: {
                val: stat,
                type: sql.INT
            },
            ExtraData: {
                val: "upload",
                type: sql.STRING
            }
        }
    })
    .then(function (data) {
        return data.transaction
            .commit()
    })
    .then(function () {
        console.log("Updated database....");
    })
    .catch((err) => {
        console.log(err);
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...