bluebird promisifyAll()然后()不与node require一起工作

时间:2016-02-05 22:22:14

标签: node.js bluebird

我第一次使用Promise,所以请耐心等待。

基本上,我没有看到我的.then()语句中的函数被调用。

当我致电t.t()时,它是否正常工作。

当我致电t.tAsync()时,再次调用t()

但是当我调用t.tAync().then(console.log);

时,结果没有被传递到当时

这是我的节点模块:

'use strict';
var t = function(){
    console.log('inside t()');
    return 'j';
};

module.exports = {
    t: t
};

这是我的演示脚本:

'use strict';

require('should');
var Promise = require('bluebird');
var t = require('../src/t');

Promise.promisifyAll(t);

/*
    Call t() once to demonstrate.
    Call tAsync() and see t() is called
    Call tAsync.then(fn), and then isn't called


 */


// this works as expected, calling t()
console.log('calling t()...' + t.t());

// this also works, calling t()
t.tAsync();

// the then() statement isn't called
t.tAsync().then(function(res){
    // I expect this to be called
    console.log('HHHUUUZZZAAAHHH' + res);
});


/*
    Keep the script running 5 seconds
 */

(function (i) {
    setTimeout(function () {
        console.log('finished program');
    }, i * 1000)
})(5);

以下是测试的输出:

inside t()
calling t()...j
inside t()
inside t()
finished program

2 个答案:

答案 0 :(得分:2)

永远不会调用您的then子句,因为tAsync期望t调用回调而不返回值。

promisifyAll包装了Node.JS的异步API,因此它包装的函数需要符合Node.JS回调签名:

function t(callback) {
  callback(null, 'j');
}

但是,我怀疑您的代码不需要promiseifyAll,而是try()method()

function t() {
  return 'j';
}

Promise.try(t).then(function(result) {
  console.log(result);
});

var t = Promise.method(function() {
  return 'j';
});

t().then(function(result) {
  console.log(result);
});

对于对比,以上是Bluebird.js具体的。要使用通用Promises执行此操作,您可以采用以下两种方法之一:

使用Promise构造函数:

function t() {
  return new Promise(function(resolve, reject) {
    resolve('j');
  });
}

t().then(function(result) {
  console.log(result);
});

或者,使用then链接功能:

function t() {
  return 'j';
}

Promise.resolve()
  .then(t)
  .then(function(result) {
    console.log(result);
  });

答案 1 :(得分:0)

我也无法理解"然后"作品。下面的代码示例(刚刚创建以了解流程)可能对您有所帮助:

var Promise = require('bluebird');

function task1(callback) {
    setTimeout(function(){
        console.log("taks1");
        callback(null, "taks1");
    }, 2000);
}

var taks1Async = Promise.promisify(task1);

taks1Async().then(function(result) {
    console.log("Current task2, previous: " + result);
    return "task2";
})
.then(function(result) {
    console.log("Current task3, previous: " + result);
    return "task3";
})
.catch(function(e) {
    console.log("error: " + e);
});

console.log("Finished");