我想在bluebird promises中包含一些同步函数,以便我可以将它们与其他异步方法混合使用。
我已经按照another question to this topic的回答创建了两个包含在承诺中的方法:
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'
答案 0 :(得分:3)
foo1.then(foo2)
表示“在then
上调用方法foo1
”。但foo1
没有属性then
。但是,调用foo1
的结果会,因为结果将是Promise。
作为参考,Bluebird的Promise#method
返回一个函数:
返回一个包装给定函数
fn
的新函数。
所以你要做的就是:
foo1('string').then(foo2)
答案 1 :(得分:1)
您必须实际调用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()
个处理程序。
答案 2 :(得分:1)
请注意,承诺会返回承诺。所以foo2不需要作为承诺。
这是一个创建承诺的解决方案,而不是使用promise.method。
此外,我还提供了一个使用函数的示例,该函数不是一个承诺,但显示它仍然会返回一个承诺。
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);
});