如何处理然后/捕获

时间:2018-09-10 14:18:10

标签: javascript es6-promise

我不知道使用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回调,不管所有诺言成功与否。

谢谢!

4 个答案:

答案 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的承诺已经被解决,上面附加了promisesthen

如果您想看到catchcatch链中发生,只需在.all函数中抛出一些例外

答案 3 :(得分:0)

问题是您正在捕获由引发的错误

const promise = axios
      .patch('/articles', article)
      .then(() => updateArticleUi(article))
      .catch(() => updateArticleUiWithError(article));

您应该在axios catch()中引发新错误,或者通过从axios调用中删除catch来使错误冒出来。