包装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>