如何在Node.js中实际使用Q Promise?

33

这可能是一个新手问题,但我对Promise很陌生,正尝试着弄清如何在node.js中使用Q

我看到教程以...开始。

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


你的例子不是 Promise 的一个好用例。 then 函数附加到 Promise 上,是的,需要有东西来创建那个 Promise。有时库会这样做。这是一个与 MySQL 相关的例子,但您可能会发现我给某人的回答很有帮助,其中我使用普通回调实现了答案,然后使用 Q Promises,重点讲解了 Q 部分正在进行的操作。 - barry-johnson
相关:https://dev59.com/PGkv5IYBdhLWcg3wghEh - laggingreflex
1
相关:https://dev59.com/XGEh5IYBdhLWcg3wWySr - Benjamin Gruenbaum
1个回答

19

promiseMeSomething()将返回一个Q promise对象,其中包含then函数,它在这里被定义,如下所示。

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

创建 Promise 对象最简单的方法是使用 Q 函数构造器,像这样:

new Q(value)

将创建一个新的 promise 对象。您可以像这样附加成功和失败处理程序:

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

此外,如果您将一个单独的 Node.js 样式函数传递给 .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);
    });

当你想在两个函数之间设置延迟,且第二个函数依赖于第一个函数时,这将非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接