2016-07-31 7 views
0

Я написал следующий код:Почему «promisify» заставляет узел игнорировать функцию?

var express = require('express'); 
var app = express(); 
var Promise = require('bluebird'); 
var counter = {}; 
counter.num = 0; 

function incr(counter) { 
    counter.num = counter.num + 1; 
} 

app.get('/check', function(req, res) { 
    Promise.promisify(console.log)(counter.num) 
     .then(Promise.promisify(incr)(counter.num)) 
     .then(console.log(counter.num)); 
    res.end("OK"); 
}); 

app.listen(4000); 

я ожидаю следующие операции, чтобы иметь место синхронное: 1. печати counter.num (= 0) 2. Приращение counter.num 3. Распечатайте новый счетчик .num (= 1)

Это то, что я получаю:

0 [Функция]

Почему не операция 2 состоялась? и Почему я получаю «[Функция]» в консоли?

ответ

0

promisify предназначен для асинхронных функций. console.log - функция синхронизации. Bluebird ожидает, что функция, которая будет пролонгирована, имеет функцию обратного вызова для последних аргументов.

И я не вижу причин, по которым вы, возможно, захотите использовать обещание в своей ситуации с вопросом.

1

Ваша ситуация не подходит для Promise.promisify().

Предполагая, что вы использует Bluebird, то Bluebird-х Promise.promisify() ожидает следующее:

  1. Функции вы promisifying должен принять обратный вызов, как это последний аргумент (часто упоминаются как Node.js асинхронной вызывающей конвенции) ,
  2. Этот вызов должен быть вызван с аргументом (err, data), когда функция завершила свою работу.
  3. Значение err должно быть ложным, когда функция выполнена успешно, и результат передается в аргументе data. Значение err должно быть правдивым при возникновении ошибки, а затем err - значение ошибки.

Ваше использование .promisify() не соответствует ни одному из этих условий.

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

app.get('/check', function(req, res) { 
    console.log(counter.num); 
    incr(counter); 
    console.log(counter.num); 
    res.end("OK"); 
}); 
Смежные вопросы