Обещай с несколькими. Тогда, когда один рассчитывает на другой - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь использовать неявно обещание-затем при доступе к mongodb через мангуста. Если у меня есть новые данные на ту же дату и пользователя, я должен удалить старые данные и вставить новые данные.

раздел A работает нормально, но я думаю, что смысл .then в том, чтобы предотвратить отступы, как у нас в методах обратного вызова. Кроме того, я не знаю, нужно ли мне .catch на каждый .then в этом случае.

Раздел B, однако, не работает, потому что createdData, возвращаемый в .then(function(createdData){}), ссылается на метод DailyData.remove() и возвращает совершенно другой объект.

A:

DailyData.remove({date: getCurrentDate(), owner: currUser})
    .then(function(){
        DailyData.create({date: getCurrentDate(), owner: currUser})
        .then(function(createdData){
            createdDataGlobal = createdData;
                UpdatedInnerData.remove({date: getCurrentDate(), owner: currUser})
                .then(function(){
                    insertNewInnerData();
                })
                .catch(handleError);
        })
        .catch(handleError);
    })
    .catch(handleError);

B

DailyData.remove({date: getCurrentDate(), owner: currUser})
    .then(function(){
        DailyData.create({date: getCurrentDate(), owner: currUser});
    })
    .then(function(createdData){
        createdDataGlobal = createdData;
        UpdatedInnerData.remove({date: getCurrentDate(), owner: currUser});
    })
    .then(function(createdData){
        insertNewInnerData();
    })
    .catch(handleError);

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Вы не возвращаете обещание в вашем .then(..)

Попробуйте это:

DailyData.remove({date: getCurrentDate(), owner: currUser})
    .then(function(){
        return DailyData.create({date: getCurrentDate(), owner: currUser});
    })
    .then(function(createdData){
        createdDataGlobal = createdData;
        return UpdatedInnerData.remove({date: getCurrentDate(), owner: currUser});
    })
    .then(function(createdData){
        insertNewInnerData();
    })
    .catch(handleError);
0 голосов
/ 17 сентября 2018

Предыдущие ответы уже указывали на проблему, заключающуюся в том, что вы не возвращали обещание в вашем .then(..) Чтобы сделать код немного более читабельным, вы можете использовать функции стрелок.Таким образом, вам не нужно явно возвращать:

DailyData.remove({date: getCurrentDate(), owner: currUser})
.then(() => DailyData.create({date: getCurrentDate(), owner: currUser})).then(() => ...)
0 голосов
/ 16 сентября 2018

Неоправданный вложенный then s - антипаттерн.Это называется адом обратного вызова;то, что обещания должны помогать, но не вызывать.

Другая проблема заключается в том, что обещания всегда должны быть связаны.DailyData.create(...) не возвращается из then обратного вызова, это приводит к неправильному потоку управления.

Это должно быть:

DailyData.remove({date: getCurrentDate(), owner: currUser})
.then(function(){
    return DailyData.create({date: getCurrentDate(), owner: currUser});
})
.then(function(createdData){
    createdDataGlobal = createdData;
    return UpdatedInnerData.remove({date: getCurrentDate(), owner: currUser});
})
.then(function(createdData){
    return insertNewInnerData();
})
.catch(handleError);

Если insertNewInnerData() асинхронный, но не возвращаетсяобещание, его нужно изменить, чтобы оно возвращалось.

Нет необходимости в нескольких catch, если только ошибки не обрабатываются по-другому.

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