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

Posted

技术标签:

【中文标题】如何在 node.js 中实际使用 Q Promise?【英文标题】:How to actually use Q promise in node.js? 【发布时间】:2014-05-05 21:28:54 【问题描述】:

这可能是一个菜鸟问题,但我是新来的承诺,并试图弄清楚如何在 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

【问题讨论】:

你的例子不是一个很好的 Promise 用例。 then 函数附加到 Promise 上,是的,需要一些东西来创建该 Promise。有时图书馆会这样做。这是一个与 mysql 相关的示例,但您可能会发现 an answer I gave someone 很有帮助,我在其中使用普通回调然后使用 Q 承诺来实现答案,并对 Q 部分进行大量评论以说明正在发生的事情。 相关:***.com/questions/10545087/… 相关***.com/questions/22519784/… 【参考方案1】:

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 接受要调用的函数作为第一个参数。因此,只需要几行代码就可以让它真正与 Promise 一起工作。所以,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);
    );

当您希望在两个函数之间有延迟并且第二个函数依赖于第一个函数时,这将很有用。

【讨论】:

以上是关于如何在 node.js 中实际使用 Q Promise?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Q.js 在循环中执行异步函数

使用 Q 在 Node.js 中同步 Promise 的麻烦

如何使用node js,reactjs,express从实际网页中的mongodb中获取数据

Node.js 异步库比较 - Q 与 Async

使用 Node.js 进行网页抓取

使用 Q Promise 的 node.js 项目的代码覆盖率