получение данных после выполнения асинхронных функций в старой версии ES - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть следующий код с двумя функциями, которые выполняются асинхронно

products = [];
categories = [];
getProduct = function() {
    productService.list().then(function(result) {
        products = ["product1", "product2"]
    });
}

getcategories = function() {
    categoryService.list().then(function(result) {
        categories = ["category1", "category2"]
    });
}

Я хочу другую функцию, которая принимает два параметра, продукты и категории, что-то вроде этого:

all = function(products, categories) {
    console.log(products, categories);
}

но, конечно, из-за асинхронной функции я получу неопределенное значение.есть ли в любом случае получить данные после выполнения предыдущих функций.я использую старый javascript, поэтому я не могу использовать asynch await.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

ES6 Решение с Promise.all:

РЕДАКТИРОВАТЬ Для кратчайшего решения :

Promise.all([productService.list(), categoryService.list()]).then(values => all(...values));

Предыдущее решение:

getProduct = function() {
    return new Promise(res => {
        productService.list().then(function(result) {
            res(["product1", "product2"]);
        });
    });
}

getcategories = function() {
    return new Promise(res => {
        categoryService.list().then(function(result) {
            res(["category1", "category2"]);
        });
    });
}

Promise.all([getProduct(), getcategories()]).then(aResolveValues => {
    aResolveValues[0] //Has the values of the first resolve promise (products)
    aResolveValues[1] //Has the values of the second resolve promise (categories)
});
0 голосов
/ 11 февраля 2019

Вы можете создать цепочку, если ваша ситуация подходит, или, в зависимости от вашей версии js (вы не упоминаете, на какую версию вы нацеливаетесь), вы можете использовать Promise.all или использовать базовый обратный вызов, например:

var products, categories,
all = function () {
  if (products && categories) {
    console.log(products, categories);
  }
},
getProducts = function (oncomplete) {
  return productService.list().then(function(result) {
    products = ["product1", "product2"];
    oncomplete();
  });
},
getCategories = function (oncomplete) {
  return categoryService.list().then(function(result) {
    categories = ["category1", "category2"];
    oncomplete();
  });
};
getProducts(all) && getCategories(all);
0 голосов
/ 11 февраля 2019

Вы можете использовать цепочку обещаний, вызывать по одному, см .:

products = [];
categories = [];

productService.list()
     .then(function(result) {
        products = ["product1", "product2"]; // products = result;
        return categoryService.list();
     }).then(function(result) {
        categories = ["category1", "category2"]; // categories = result;
        all(products, categories);
     }).catch(function(ex) {
        // Error handele
     }) ;

см. Пример здесь

еще один вариант - использовать Обещание.all может соответствовать вашему варианту использования, так как вам не нужно читать функции одну за другой.в этом варианте вы должны сделать что-то вроде:

Promise.all([productService.list(), categoryService.list()]).then(function(values) {
  all(value[0],value[1]);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...