我第一次使用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
答案 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");