2016-05-17 2 views
0

Я не понимаю, почему Promise.promisify Bluebird не обещает функцию запроса, потому что она выполняет обратный вызов, как большинство функций стиля узла. Может ли это быть метод агрегации Mongoose(), который нарушает код?Bluebird promisify not wrapping node style function

function query(callback) { 
    model.aggregate([{$sort:{a: -1}}], function(err, items) { 
    if (err) { 
     console.log(err); 
    } 
    let mostA = items[0].a; 
    Caller.aggregate([{$sort:{b: -1}}], function(err, items) { 
     if (err) { 
     console.log(err); 
     } 
     let mostB = items[0].b; 
     callback({mostA: mostA, mostB: mostB}); 
    }); 
    }); 
}; 

let most = Promise.promisify(query); 

most() 
.then((data) => { 
    // do something 
}) 
.catch((err) => { 
    console.log('err:', err); // I always get an error. 
}); 
+0

Это не стиль узел обратного вызова ??? – Bergi

+1

Если вы пишете эту функцию самостоятельно, вы скорее должны обещать эти методы 'aggregate'. – Bergi

+0

Да, 'model.aggregate()' то, что нужно пролонгировать, а не 'query()'. –

ответ

2

Это не обратный вызов стиля узла. Обратный вызов стиля узла должен делать следующее:

  1. Обратный вызов должен быть последним аргументом метода (вы хорошо разбираетесь в этом).
  2. Обратный вызов должен иметь два аргумента (вы плохо разбираетесь в этом)
  3. Первым аргументом для обратного вызова должно быть значение ошибки, которое является правдивым всякий раз, когда есть ошибка (вы не очень хороши в этом).
  4. Второй аргумент для обратного вызова должен быть независимо от возвращаемых данных (если они есть).

Кроме того, ваша функция query() не выполняет правильную обработку ошибок. Он должен вызвать обратный вызов со значением ошибки в качестве первого аргумента, а затем прекратить дальнейшую обработку.

Итак, когда вы делаете это:

callback({mostA: mostA, mostB: mostB}); 

Вы говорите обратный вызов, что есть ошибка, потому что вы передаете первый аргумент как truthy значения.

Если вы хотите, чтобы сделать его правильную форму, вы могли бы сделать это:

callback(null, {mostA: mostA, mostB: mostB}); 
+0

@MichaelL - Это ответ на ваш вопрос? Если это так, нажмите зеленую галочку слева от ответа, чтобы сообщить об этом сообществу и заработать себе очки репутации для выполнения надлежащей процедуры здесь при переполнении стека. Если нет, объясните, в какой части вашего вопроса вы все еще запутались. – jfriend00

Смежные вопросы