Как получить исправленное значение / отклоненную ошибку в блоке finally? - PullRequest
1 голос
/ 05 апреля 2019

Используя библиотеку обещаний Javascript Q.js, как я могу получить объект разрешенного значения / отклоненной ошибки в блоке finally.В основном я хочу выполнить общий код в блоке finally с разрешенными данными, которые были переданы в блок then.

var q = require('Q');

var defer = q.defer();

setTimeout(function () {
    console.log("----------------------------------");

    promise2 = defer.promise;
    var t = promise2.then(function (value) {
        console.log('defer then => ' + value);
    })
    .catch(function (err) {
        console.log('defer catch => ' + err);
    })
    .finally(function (data) {
        console.log('function pro1 : ' + defer);
        // console.log('defer finally(resolved value) => ' + data); // how to get 123 here
        // console.log('defer finally(error) => ' + data); // how to get 'Error occurred.' here
        doSomething(data);
    })

    setTimeout(function () {
        console.log('after2: ' + t);
    },2000)

    defer.resolve('123');
    defer.reject('Error occurred.');
},10);

Ответы [ 3 ]

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

Функция finally - это функция, используемая для выполнения кода независимо от разрешения или отклонения обещания, например, кода для очистки ресурсов (закрытие соединений и т. Д.).Поэтому не рекомендуется использовать его для случая, когда вам нужны данные.Кроме того, я не предлагаю использовать глобальную переменную, так как это не очень соответствует идее Обещания.

Если вам нужны оба значения в случае успеха или сбоя Обещания, я предлагаю использовать последовательностьthen, catch и then, например:

var q = require('Q');

var defer = q.defer();

setTimeout(function () {
    console.log("----------------------------------");

    promise2 = defer.promise;
    var t = promise2.then(function (value) {
        console.log('defer then => ' + value);
        return { status: "success", value: value };
    })
    .catch(function (err) {
        console.log('defer catch => ' + err);
        return { status: "err", value: err };
    })
    .then(function (dataOrError) {
        console.log('function pro1 : ' + defer);
        // console.log('defer finally(resolved value) => ' + data); // how to get 123 here
        // console.log('defer finally(error) => ' + data); // how to get 'Error occurred.' here
        doSomething(dataOrError); // Here you can check if you got an error or the value you exepected.
    })

    setTimeout(function () {
        console.log('after2: ' + t);
    },2000)

    defer.resolve('123');
    defer.reject('Error occurred.');
},10);

Но, если вы собираетесь выполнить код, в зависимости от результата вашего обещания (разрешенного или отклоненного), вам следуетиспользуйте этот шаблон:

promise.then((data) => {
   //doSomething with data
   return data;
 }).catch((err) => {
   //doSomithing with error
   return error;
 }).then((dataOrError) => {
  //doSomething with dataOrErro that does not depend if it is data or error
 });

0 голосов
/ 05 апреля 2019

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

const func = () => new Promise((resolve) => {
    resolve(10);
});

let data;

(async() => {
    try {
        data = await func();
    }
    catch(e) {
      // ..
    }
    finally {
        console.log(data);
    }
})();
0 голосов
/ 05 апреля 2019

Вы можете добавить переменную в родительскую область, например:

var q = require('Q');

var defer = q.defer();

setTimeout(function () {
    console.log("----------------------------------");

    var promise2 = defer.promise;
    var data = false;
    var t = promise2.then(function (value) {
        console.log('defer then => ' + value);
        data  = value;
    })
    .catch(function (err) {
        console.log('defer catch => ' + err);
    })
    .finally(function () {
        console.log('function pro1 : ' + defer);
        // console.log('defer finally(resolved value) => ' + data); // how to get 123 here
        // console.log('defer finally(error) => ' + data); // how to get 'Error occurred.' here
        doSomething(data);
    })

    setTimeout(function () {
        console.log('after2: ' + t);
    },2000)

    defer.resolve('123');
    defer.reject('Error occurred.');
},10);
...