包装async方法返回一个promise(bluebird)

时间:2015-11-24 21:21:00

标签: node.js promise bluebird

我想在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'

3 个答案:

答案 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);
});