我有两个被调用的函数返回promises,我想通过catch语句捕获错误来使它更清晰。
我认为我正在以正确的方式进行,尽管代码以异步方式正确调用函数。
这些是我的电话:
// The text is hopefully the email address and the pin number
fb.verifyEmailPin(text).then(function(reply){
// Set the new state to 'get_city'
fb.setState(FB_ID).then(function(result){
}).catch(function(v) {
// Rejection
// If there was an error then prompt the user to enter again
}); // setState
}).catch(function(err){
});// verifyEmailPin
这是实际的函数 - 对于setState,我还没有为verifyEmailPin函数编写代码,但它在回传解析或拒绝方面遵循与设置状态相同的结构。
/*
* Function : setState
* Purpose : Set the state to what every is send in on the parameter
*/
exports.setState = function(fbid,newstate){
var success = 'Y';
return new Promise((resolve, reject) => {
client.hmset(fbid, { 'state': newstate });
// Check that we have set it ok
client.hmget(fbid,'state',function(err,reply){
if (err || reply != newstate) {
return reject(err);
}
return resolve(success);
});
}).catch(function(v) {
});
}
答案 0 :(得分:2)
最后只能使用一个.catch
。为了减少缩进,你可以链接.then
。如果你在之后做异步,那么 -functions确保返回一个promise,否则以下的thens将不会等待它的完成。在同步操作上(例如somePromise.then(JSON.parse).then(...))
,不需要承诺。
这是一个简短的例子:
function promiseTest(x) {
Promise.resolve(x).then(function(a) { // instead of Promise.resolve do something asynchronous, e.g. an ajax call that returns a promise
if (typeof x != "number") throw "NaN";
return a*2;
}).then(function(a) {
console.log(a);
}).catch(function(err) {
console.error("error in promise:", err);
})
}
promiseTest(1); //logs 2 to the console
promiseTest("a"); // shows error message in the console
如果你想并行运行几个异步操作并等待所有这些操作完成,你可以使用Promise.all
为它提供一组promises。
Promise.all([doSomethingAsyncAndReturnPromise(), somethingElseAsync()]).then(function results) {
// results[0] contains the result from doSomethingAsyncAndReturnPromise
// results[1] contains the result from somethingElseAsync
});