如何在finally块中获得已解决的值/拒绝错误?

问题描述 投票:1回答:3

使用Q.js Javascript promise库,如何在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);
javascript node.js asynchronous promise q
3个回答
1
投票

finally是一个用于执行代码的函数,无论解析或拒绝承诺,代码如清理资源(关闭连接等)。因此,在需要数据的情况下使用它并不是一个好主意。此外,我不建议使用全局变量,因为这并不遵循Promise的想法。

如果在Promise成功或失败的情况下你需要两个值,我建议使用thencatchthen的序列,如下所示:

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
投票

您可以在父作用域中添加变量,如下所示:

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);

0
投票

使用await和一个全局变量。等到promise得到解决,然后将检索到的值分配给全局变量,然后可以在final块中访问该变量。

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

let data;

(async() => {
    try {
        data = await func();
    }
    catch(e) {
      // ..
    }
    finally {
        console.log(data);
    }
})();
© www.soinside.com 2019 - 2024. All rights reserved.