包装asynchronous方法返回一个承诺(蓝鸟)

我想在蓝鸟承诺中包装一些同步函数,以便我可以将它们与其他asynchronous方法混合。

我对这个主题的另一个问题的答案,并创造了两个方法包装在一个承诺:

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上的方法'。 但是foo1没有属性。 然而, 调用foo1的结果确实如此 ,结果将是一个Promise。

作为参考,Bluebird的Promise#method返回一个函数:

返回包装给定函数fn的新函数。

所以你想要做的是这样的:

 foo1('string').then(foo2) 

请注意,承诺返回承诺。 所以foo2是不必要的。

这是一个创造一个承诺,而不是使用promise.method的解决scheme。

另外,我还包括一个使用函数的例子,这个函数不是一个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>