如何在node.js中实际使用Q promise?

时间:2014-03-27 04:56:16

标签: javascript node.js promise q

这可能是一个noob问题,但我是承诺的新手,并试图找出如何在node.js中使用Q

我看到tutorial

开头
promiseMeSomething()
    .then(function (value) {}, function (reason) {});

但我没有意识到.then的确切来源。我想它来自

var outputPromise = getInputPromise()
    .then(function (input) {}, function (reason) {});

getInputPromise()来自哪里?我发现之前没有提到它。


我已将它包含在我的项目中

var Q = require('q');

// this is suppose, the async function I want to use promise for
function async(cb) {
    setTimeout(function () {
        cb();
    }, 5000);
}

async(function () {
    console.log('async called back');
});

如何在我的示例中使用Q及其.then

1 个答案:

答案 0 :(得分:19)

promiseMeSomething()将返回一个Q promise对象,其中包含then函数,defined,就像这样

Promise.prototype.then = function (fulfilled, rejected, progressed) {

创建Promise对象的最简单方法是使用Q函数构造函数,如下所示

new Q(value)

将创建一个新的promise对象。然后,您可以附加成功和失败处理程序,例如

new Q(value)
.then(function(/*Success handler*/){}, function(/*Failure handler*/){})

此外,如果您将单个nodejs样式函数传递给.then函数,它将使用此成功值调用该函数

callback(null, value)

或者如果有问题,那么

callback(error)

对于您的特定情况,setTimeout接受要调用的函数作为第一个参数。因此,只需几行代码就可以使它真正适用于promises。因此,Q有一个方便的功能,为此Q.delay,可以像这样使用

var Q = require('q');

function async() {
    return Q.delay(1000)
}

async()
.then(function() {
    console.log('async called back');
});

你可以像这样写

Q.delay(1000)
    .then(function() {
        console.log('async called back');
    });

如果你想用另一个值调用回调函数,那么你可以这样做

Q.delay(1000, "Success")
    .then(function(value) {
        console.log('async called back with', value);
    });

当你想在两个函数之间有一个延迟而第二个函数依赖于第一个函数时,这将是有用的。