包装异步方法以返回promise(bluebird)



我想将一些同步函数封装在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()处理程序。

最新更新