Обещание разрешить / отклонить в случае вложенного обещания в Node.js - PullRequest
1 голос
/ 22 апреля 2019

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

Пример:

function p1(val)
{
    return new Promise((resolve, reject) => {

        //do something with val
        if(val == true)
           reject(err);

        p2()
        .then(result => resolve(result)
        .catch(reject); //is this line necessary?
    });
}

function p2()
{
    return new Promise((resolve, reject) => {
        //resolve or reject...
    });
}

1 Ответ

1 голос
/ 22 апреля 2019

С вашим исправленным кодом, в котором вы выполняете работу до вызова p2, у вас есть несколько вариантов.Если вы рады, что ошибки в начальной, синхронной части вашего functino являются синхронными ошибками, а не обещаниями отклонения, вы можете просто сделать это:

function p1(val) {
    //do something with val
    if (val == true)
        throw err;

    return p2();
}

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

Если вы хотите, чтобы функция всегда сообщала об успехе / неудаче с помощью обещания, то если вы выполняете начальную работу, вам нужно ваше собственное обещание:

function p1(val) {
    return new Promise((resolve, reject) => {
        //do something with val
        if(val == true)
           reject(err);

        resolve(p2());
    });
}

Часть resolve(p2()) разрешает обещание p1, созданное для обещания p2: если обещание p2 отклоняется, обещание p1 отклоняется с причиной отклонения p2;если обещание p2 выполняется, обещание p1 выполняется со значением выполнения p2.

Или вы можете использовать функцию async, которая имеет тот же результат:

async function p1(val) {
    //do something with val
    if(val == true)
        throw err;

    return p2();
}

В обоих случаях это гарантирует, что любая ошибка, выданная исходным кодом до p2, приведет к отклонению, а не к синхронной ошибке, даже если исходный код не включает асинхронную обработку.

Главное, что нужно помнить, это то, что когда у вас уже есть обещание (например, из p2), нет необходимости использовать new Promise;вместо этого просто зацепите обещание, которое вы уже имеете.( Подробнее здесь .) Но когда вы делаете что-то до , вы получаете обещание, как в вашем пересмотренном примере, вы можете создать свое собственное в зависимости от того, хотите ли вы первую частьошибки вашей функции должны быть синхронными или обещать отклонение.

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