我不知道使用JS promise解决这种情况。
想象一下,我有一些文章,我想发送一个补丁请求来更新它们。每篇文章我发送一个请求。如果一篇文章的请求成功,那么我将更新该文章,但是如果请求失败,那么我将以另一种方式更新该文章。另外,我想向用户显示一条消息,告知所有文章是否已正确更新。
这不是我的真实情况,这可能是一个奇怪的例子。但这就是我想在我的React应用程序中完成的工作。
这是我现在正在尝试做的事情:
const saveArticles = articles => {
const promises = [];
articles.forEach(article => {
const promise = axios
.patch('/articles', article)
.then(() => updateArticleUi(article))
.catch(() => updateArticleUiWithError(article));
promises.push(promise);
});
Promise.all(promises)
.then(() => tellTheUserThereWasNoErrors())
.catch(() => tellTheUserThereWasSomeErrors());
};
这不起作用,因为Promise.all
始终执行then
回调,不管所有诺言成功与否。
谢谢!
答案 0 :(得分:1)
您的Route::any('/register', 'AuthController@register');
和updateArticleUi
应该具有各自的返回值,以便在查看结果数组时可以区分是否有错误:
updateArticleUiWithErrors
答案 1 :(得分:1)
这有效:
function axiosPatchRequest(url,data) {
return new Promise(function (resolve, reject) {
if (data) {
resolve(url);
} else {
reject('DATA_NOT_FOUND');
}
})
}
function updateArticleUi(data,article) {
return new Promise(function (resolve, reject) {
resolve({type:"updateArticleUi ",data,article});
})
}
function updateArticleUiWithError(data,article) {
return new Promise(function (resolve, reject) {
reject({type:"updateArticleUiWithError ",data,article});
})
}
function tellTheUserThereWasNoErrors(data){
console.log("tellTheUserThereWasNoErrors",data);
}
function tellTheUserThereWasSomeErrors(error){
console.log("tellTheUserThereWasSomeErrors",error);
}
const execute = (articles)=>{
const promises = [];
articles.forEach(article => {
const promise = axiosPatchRequest('/articles', article)
.then((data) => {
return updateArticleUi(data,article);
})
.catch((error) => {
return updateArticleUiWithError(error,article);
});
promises.push(promise);
});
Promise.all(promises)
.then((data) => tellTheUserThereWasNoErrors(data))
.catch((error) => tellTheUserThereWasSomeErrors(error));
};
execute(["one","","three"]);
execute(["one","two","three"]);
答案 2 :(得分:0)
stdin
总是会调用,因为您添加到Promise.all
的承诺已经被解决,上面附加了promises
或then
如果您想看到catch
在catch
链中发生,只需在.all
函数中抛出一些例外
答案 3 :(得分:0)
问题是您正在捕获由引发的错误
const promise = axios
.patch('/articles', article)
.then(() => updateArticleUi(article))
.catch(() => updateArticleUiWithError(article));
您应该在axios catch()
中引发新错误,或者通过从axios调用中删除catch
来使错误冒出来。