Обещаю всем, не стреляя - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь заставить обещания работать впервые. Тем не менее, мой Promise.all никогда не стреляет.

Я использую node.js & express

const promises = [
    new Promise( () => {
        var query = `...`;  

        mssql.query(query, function(obj){
            finalRes['key1'] = obj.recordset;
            return true;
            //this works
        });
    }),
    new Promise( () => {
        var query = `...`;  

        mssql.query(query, function(obj){
            finalRes['key2'] = obj.recordset;
            return true;
            //this works
        });
    }),
    ...
]

Promise.all(promises).then(() => {
    res.send(finalRes);
    // this is never firing
});

Я занимался поиском товаров и не могу найти решение. Буду признателен, если кто-то укажет, что я здесь не так делаю.

Приветствия

1 Ответ

0 голосов
/ 01 сентября 2018

Ваш код создания обещания неверен, так как он никогда не разрешается. Что вы на самом деле должны делать, так это запускать resolve функции внутри вашего кода на основе обратного вызова. Я бы пошел немного дальше - и разрешил бы все эти обещания с их результатами вместо того, чтобы изменять какое-то внешнее значение. Как это:

const promises = [
  new Promise( (resolve, reject) => {
    var query = `...`;  
    mssql.query(query, function(obj){
      resolve({key1:obj.recordset});
    });
  }),
  new Promise( (resolve, reject) => {
    var query = `...`;  
    mssql.query(query, function(obj){
      resolve({key2:obj.recordset});
    });
  }) // ...
];

Promise.all(promises).then(results => {
  res.send(Object.assign({}, ...results));
});

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

Как примечание, ваш код чрезмерно оптимистичен, он также должен обеспечивать error обратных вызовов с reject() вызовом для каждого запроса.

...