为什么'promisify'导致节点忽略一个函数?

时间:2016-07-31 14:08:20

标签: node.js express synchronization promise

我写了以下代码:

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. print counter.num(= 0) 增加counter.num 3.打印新的counter.num(= 1)

这就是我得到的:

  

0 [功能]

     

0

为什么没有进行手术2?为什么我在控制台中得到“[功能]”?

2 个答案:

答案 0 :(得分:1)

您的情况不适合Promise.promisify()

假设您使用的是Bluebird,那么Bluebird' Promise.promisify()需要以下内容:

  1. 你承诺的函数必须作为最后一个参数进行回调(通常称为node.js异步调用约定)。
  2. 当函数完成其操作时,必须使用参数(err, data)调用该回调。
  3. 当函数成功并且结果在err参数中传递时,data值必须为false。如果出现错误,err值必须是真值,然后err是错误值。
  4. 您对.promisify()的使用与这些条件中的任何一个都不匹配。

    由于promises的目的是跟踪或协调异步操作,因此您甚至不应该对此特定代码使用promises。因为您的所有counter操作都是同步的,所以您可以这样做:

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

答案 1 :(得分:0)

promisify用于异步功能。 console.log是同步功能。 Bluebird期望函数被赋予最后一个参数的回调函数。

在你的质疑情况下,我没有看到你可能想要使用诺言的任何理由。