Проблема с последовательностью обещаний nodejs

1

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

Отображаемая последовательность -

a) "перед вызовом" b "после вызова" c "" внутри сохранения "d)" никаких проблем "

Что я могу изменить в коде, чтобы получить порядок журналов как below-

a) "до вызова" b) "после вызова" c) "нет проблем" d) "внутри сохранения"

Код контроллера -

module.exports.updateLocalTransportVendorDtls = function (req, res) {

    var transportSchema = new transportModel();

    new Promise(function (resolve, reject) {

        checkForNewVehicleType(req, function (doc) {
            resolve(doc)
        })
    })
    .then(function (doc) {

        var updateJustServiceDtls = doc.split(/\|/)[2];
        var updateVehicle = doc.split(/\|/)[0];
        var addVehicle = doc.split(/\|/)[1];

        if (updateJustServiceDtls == 'true') { /* To update service details for the same vendor */
            console.log("before call")
            updateJustServiceDetailsOnly(req, res)
            console.log("after call")        
        }

    }).then(function () {
        console.log("inside save")
        transportSchema.save(function (error) {
            if (error) {               
                return res.status(500).json({ "Message": error.message.trim() });
            }
            else {
                return res.json({ "Message": "Data got inserted successfully in local_transport_details collection" });
            }
        })

    }).catch(function (err) {
        return res.json({ "Message": err.message });
    });
}

функция call-

var updateJustServiceDetailsOnly = function (req, res) {

    var promise = new Promise(function (resolve, reject) {

                //code to update db
                console.log("no issues")
                resolve();
            });
    })
    return promise;
}
Теги:

2 ответа

0
Лучший ответ

Как насчет after call, вы можете опустить его, если он является только журналом и возвращает результат updateJustServiceDetailsOnly.

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

if (updateJustServiceDtls == 'true') {
    console.log("before call")
    return updateJustServiceDetailsOnly(req, res)
    // console.log("after call")  this will not be called
}

С помощью этого кода результат будет

a)"before call" b)"no issues" c)"inside save"
0

Просто верните свое обещание.

 if (updateJustServiceDtls == 'true') { /* To update service details for the same vendor */
        console.log("before call")
        return updateJustServiceDetailsOnly(req, res)
        console.log("after call")        
 }

В этом случае, очевидно, после того, как звонок не будет зарегистрирован. Но только переместить журнал в следующем .then.

Когда вы находитесь в цепочке обещаний, если у вас есть другое обещание, и вы хотите подождать, просто верните его.

Пример:

Promise.resolve()
.then(() => {
    // I have an async to do, I return it to wait for it
    return Promise.resolve('after call');
})
.then((result) => {
    // it will be called only when the Promise returned in the previous chain will resolve
    // the result is the data passed in the resolution of your promise
    console.log(result); // after call
}); 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню