我想将一些同步函数封装在bluebird promise中,这样我就可以将它们与其他异步方法混合使用。
我遵循了这个主题的另一个问题的答案,并创建了两个包含在promise中的方法:
var Promise = require("bluebird");
var foo1 = Promise.method(function(arg){
console.log(arg);
return "ret foo1";
});
var foo2 = Promise.method(function(arg){
console.log(arg);
return "ret foo1";
});
但是当调用这些方法时
foo1.then(foo2);
我有这个例外
TypeError: Object function () {
var ret = new Promise(INTERNAL);
ret._captureStackTrace();
ret._pushContext();
var value = tryCatch(fn).apply(this, arguments);
var promiseCreated = ret._popContext();
debug.checkForgottenReturns(
value, promiseCreated, "Promise.method", ret);
ret._resolveFromSyncValue(value);
return ret;
} has no method 'then'
foo1.then(foo2)
的意思是"在foo1
上调用方法then
"。但是foo1
不具有属性then
。但是,调用foo1
的结果确实,因为结果将是Promise。
作为参考,Bluebird的Promise#method
返回一个函数:
返回一个新函数,该函数包装给定的函数
fn
。
所以你想做的是:
foo1('string').then(foo2)
请注意,promise返回promise。因此,foo2作为承诺是不必要的。
这里有一个创建promise而不是使用promise.method的解决方案。
此外,我还提供了一个使用函数的示例,该函数不是promise,但表明它无论如何都会返回promise。
var Promise = require('bluebird');
var foo1 = new Promise(function(resolve){
resolve("ret foo1");
});
var foo2 = new Promise(function(resolve){
resolve("ret foo2");
});
function foo3(arg){
console.log('Promises return promises');
return arg;
}
foo1.then(foo3).then(foo2).then(function(arg){
console.log(arg);
});
您必须实际调用foo1()
,如下所示:
foo1("hello").then(foo2);
foo1
是一个返回promise的函数。你必须打电话给它才能得到回报。
工作片段:
var foo1 = Promise.method(function(arg){
log(arg);
return "ret foo1";
});
var foo2 = Promise.method(function(arg){
log(arg);
return "ret foo1";
});
foo1("hello").then(foo2);
function log(x) {
var div = document.createElement("div");
div.innerHTML = x;
document.body.appendChild(div);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.0.5/bluebird.js"></script>
您可能还想知道foo2
不必返回承诺,因此您不需要Promise.method()
,除非您希望能够在链中首先调用它。正则函数可以是.then()
处理程序。