2016-07-31 76 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); 

我期待下面的操作发生synchronically: 1.打印counter.num(= 0) 2.增量counter.num 3.打印新的计数器.nu​​m(= 1)

这是我得到:

0 [功能]

为什么没有操作2发生?为什么我会在控制台中获得“[功能]”?

回答

0

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

我看不出有什么理由可能希望在您的问题情况下使用承诺。

1

您的情况不适用于Promise.promisify()

假设你正在使用蓝鸟,蓝鸟随后的Promise.promisify()预计如下:

  1. 你promisifying必须采取一个回调,因为它最后一个参数(通常被称为Node.js的异步调用约定)的功能。
  2. 当函数完成其操作时,必须使用参数(err, data)调用该回调。
  3. 当函数成功并且结果在data参数中传递时,err值必须是falsey。当出现错误时,err值必须真实,然后err是错误值。

您对.promisify()的使用不符合以上任何一种条件。

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

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