gpt4 book ai didi

javascript - 为什么这个 promise 不会转到下一个 "then"?

转载 作者:行者123 更新时间:2023-11-30 14:45:11 24 4
gpt4 key购买 nike

所以我有这段代码:

Parse.Cloud.define("apiCall", function(request, response) {

return Parse.Cloud.httpRequest({
// API call 1
}).catch(function(error) {
/// Only perform this if the first call fails

// Return valid json here, to mock the Parse.Cloud.httpRequest below
return Parse.Promise.as({"data": "this is an expected JSON"});

return Parse.Cloud.httpRequest({
// API call 2
});
}).then(
function(httpResponse) {
/// This should perform after call 1, or call 2 if call 1 failed

return Parse.Cloud.httpRequest({
// API call 3
});
}
).catch(
function(error) {
console.log('FAIL');
return response.error(error);
}
);
});

即使调用 1 失败,我预计调用 3 也会执行,但显然它没有,它执行第一个 catch block ,然后执行最后一个 catch堵塞。当我在 catch block 中返回一个新的 promise 时,我认为我正确地捕获了错误?

最佳答案

长话短说,每个 Promise 链应该只有一个 catch block 。

您可以像这样使用 async/await block 重构您的代码:

Parse.Cloud.define("apiCall", async function(request, response) {

let response = null;
try {
response = await Parse.Cloud.httpRequest({
// API call 1
})
} catch (error) {
console.log({"data": "this is an expected JSON"});

response = Parse.Cloud.httpRequest({
// API call 2
});
}
try {
// Use response variable here
let response2 = Parse.Cloud.httpRequest({
// API call 3
});
return response2;
} catch (error) {
console.log('FAIL');
return response.error(error);
}
});

如果你想坚持使用 Promise 链,你也可以这样做:

Parse.Cloud.define("apiCall", function(request, response) {

return new Promise((resolve, reject) => {
Parse.Cloud.httpRequest({
// API call 1
})
.then(function (data) {
resolve(data);
})
.catch(function(error) {
/// Only perform this if the first call fails

// Return valid json here, to mock the Parse.Cloud.httpRequest below
console.log({"data": "this is an expected JSON"});

Parse.Cloud.httpRequest({
// API call 2
})
.then(function (data) {
resolve(data);
})
.catch(function (error) {
reject(error);
})
})
}).then(
function(httpResponse) {
/// This should perform after call 1, or call 2 if call 1 failed

return Parse.Cloud.httpRequest({
// API call 3
});
}
).catch(
function(error) {
console.log('FAIL');
return response.error(error);
}
);
});

关于javascript - 为什么这个 promise 不会转到下一个 "then"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49047907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com