如何解决 finally 块中的 value/rejected 错误?
How to get resolved value/rejected error in finally block?
使用 Q.js Javascript promise 库,如何在 finally 块中获取已解决的 value/rejected 错误对象。基本上我想在 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);
您可以在父作用域中添加变量,如下所示:
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);
使用await
和一个全局变量。等到 promise 得到解决,然后将检索到的值分配给全局变量,然后您可以在 final
块中访问它。
const func = () => new Promise((resolve) => {
resolve(10);
});
let data;
(async() => {
try {
data = await func();
}
catch(e) {
// ..
}
finally {
console.log(data);
}
})();
finally 是一个用于执行代码的函数,无论承诺的决议或拒绝如何,代码如清理资源(关闭连接等)。因此,在需要数据的情况下使用它不是一个好主意。另外,我不建议使用全局变量,因为这不太符合 Promise 的想法。
如果在 Promise 成功或失败时需要这两个值,我建议使用 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
});
使用 Q.js Javascript promise 库,如何在 finally 块中获取已解决的 value/rejected 错误对象。基本上我想在 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);
您可以在父作用域中添加变量,如下所示:
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);
使用await
和一个全局变量。等到 promise 得到解决,然后将检索到的值分配给全局变量,然后您可以在 final
块中访问它。
const func = () => new Promise((resolve) => {
resolve(10);
});
let data;
(async() => {
try {
data = await func();
}
catch(e) {
// ..
}
finally {
console.log(data);
}
})();
finally 是一个用于执行代码的函数,无论承诺的决议或拒绝如何,代码如清理资源(关闭连接等)。因此,在需要数据的情况下使用它不是一个好主意。另外,我不建议使用全局变量,因为这不太符合 Promise 的想法。
如果在 Promise 成功或失败时需要这两个值,我建议使用 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
});