Как правильно обрабатывать обещание от нескольких вызовов API? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть конечная точка, где я делаю несколько одинаковых вызовов, но с другим идентификатором в URL-адресе. Кажется, что он выполняет вызовы API, но не вызывает мое предупреждение.

Как я могу правильно обработать это в случае сбоя? Есть ли более чистый / эффективный подход?

let myArray = [1,2,3,4]

    myArray.forEach(i => {
        let update = request.update(`view/${i}`); 
        return update;
    });
    if(update)
    { 
      alert("Success") 
    } else { 
      alert("failed")  
    } 

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Способ работы с обещанием - использовать функцию .then(), которая будет выполнять функции обратного вызова для обработки результата каждого из ваших запросов. Вы должны использовать эту функцию следующим образом:

//promise.then(onFulfilled[, onRejected]);

let myArray = [1,2,3,4]

myArray.forEach(i => {
    request.update(`view/${i}`).then(response => {
        //Fulfilment
    },reason=>{
        //Rejection
    });
});

Этого должно быть достаточно для вашей проблемы. Иногда я предпочитаю сохранять его «простым», управляя результатом обещания только в первом обратном вызове, это означает, что вы контролируете получаемый ответ и можете идентифицировать отказ другим способом:

let myArray = [1,2,3,4]

myArray.forEach(i => {
    request.update(`view/${i}`).then(response=>{
        if(response){
            //If I control the response I can identify the status of the request
            const data = JSON.parse(response);
            switch(data.status){
               case "error":
                   //Do stuff
               break;
               case "unknown":
                   //Do stuff
               break;
               case "valid":
                   //Do stuff
               break;
            }
        }else{
            //This means no response was received, it is different from Promise rejection
            //it may have been caused by network issues.
            //You can trigger some error from here or do what you want
        }
    });
    //This way I treat the Promise in one callback instead of two
});

Документация для .then () доступен здесь . Надеюсь, это кому-то помогло.

0 голосов
/ 14 июля 2020

Предполагая, что request.update() возвращает Promise, вы можете использовать Promises.all () . Вы должны прочитать docs , чтобы понять, как это работает. Если хотя бы один запрос завершится неудачно, ваша функция завершится ошибкой, даже если другие запросы успешно обновлены.

//
let myArray = [1,2,3,4]

//a place to store the promises while we wait
let requests = [];

//
myArray.forEach(i => {
    //save the promise in the array
    requests.push( request.update(`view/${i}`) );
});

//wait for all requests to finish
Promise.all( requests )
    .then(results => alert('Success'))
    .catch(e => alert("failed"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...