Async / Await - Обещание с функцией карты объектов - PullRequest
0 голосов
/ 23 января 2019

Я действительно запутался. Я пытался многое, но не могу достичь правильного результата.

Вот сценарий; У меня есть список продуктов, которые я могу сделать с множественным выбором и удалить их один за другим. Я хочу подождать, пока все элементы могут быть удалены, а затем верните мне счет.

async delete (ids) {

    const res = await this.deleteProcess(ids);
    return res;

  },

  deleteProcess(ids) {

    let countS = 0;

    Object.assign(ids).map((id) => {

      axios({
        method: "DELETE",
        url: store.getters.getServerPath + "api/v1/product/" + id,
        headers: store.getters.getConfigHeaders,
        withCredentials: true
      }).then(function (response) {

        countS++;

      }).then(() => {

        console.log(countS);
        return countS;
      });

    });
  }

И вызовите эту функцию так:

deleteSelected (id) {
                if (id !== undefined) {
                    this.selectedRows.push(id);
                }
                controller.delete(this.selectedRows).then(function (res) {

                    alert(res + " items deleted");
                });
            },

Результат res всегда возвращает undefined. Но внутри deleteProcess console.log отображается, сколько элементов было удалено.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Ваш метод deleteProcess ничего не возвращает, поэтому res не определено. Если вы хотите, чтобы код полностью использовал шаблон async / await и удалял их один за другим, вы можете сделать:

async deleteProcess(ids) {
  let countSuccess = 0;
  let countFailure = 0;
  for (const id of ids) {
     try {
       await axios({
         method: "DELETE",
         url: store.getters.getServerPath + "api/v1/product/" + id,
         headers: store.getters.getConfigHeaders,
         withCredentials: true
       });
       countSuccess++;
      } catch (error) {
       countFailure++;
      }
  }
  return countSuccess;
}
0 голосов
/ 23 января 2019

Вместо этого следует использовать Promise.all, увеличивая countS каждый раз, когда возвращается ответ

deleteProcess(ids) {
  let countS = 0;
  return Promise.all(ids.map((id) => (
    axios({
      method: "DELETE",
      url: store.getters.getServerPath + "api/v1/product/" + id,
      headers: store.getters.getConfigHeaders,
      withCredentials: true
    }).then(function (response) {
      countS++;
    })
  )))
  .then(() => countS);
}

Но вы также можете просто подсчитать length из ids, а не сохранять внешнюю переменную countS:

.then(() => ids.length);

Также обратите внимание, что

Object.assign(ids)

ничего не делает - результирующее выражение равно === исходной переменной ids, поэтому можно просто использовать исходную переменную.

Вы также можете рассмотреть возможность добавления catch при возникновении проблемы:

controller.delete(this.selectedRows)
  .then(function (res) {
    console.log(res + " items deleted");
  })
  .catch((err) => {
    console.log('error', err);
  });
...