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

lag*_*lex 33 javascript node.js promise q

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

我看到教程以a开头

promiseMeSomething()
    .then(function (value) {}, function (reason) {});
Run Code Online (Sandbox Code Playgroud)

但是我没有意识到它究竟.then来自哪里.我想它来自

var outputPromise = getInputPromise()
    .then(function (input) {}, function (reason) {});
Run Code Online (Sandbox Code Playgroud)

但是哪里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');
});
Run Code Online (Sandbox Code Playgroud)

我如何在我的例子中使用Q它.then?

the*_*eye 19

promiseMeSomething()将返回一个Q promise对象,它将then在其中具有函数,这是定义的,就像这样

Promise.prototype.then = function (fulfilled, rejected, progressed) {
Run Code Online (Sandbox Code Playgroud)

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

new Q(value)
Run Code Online (Sandbox Code Playgroud)

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

new Q(value)
.then(function(/*Success handler*/){}, function(/*Failure handler*/){})
Run Code Online (Sandbox Code Playgroud)

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

callback(null, value)
Run Code Online (Sandbox Code Playgroud)

或者如果有问题,那么

callback(error)
Run Code Online (Sandbox Code Playgroud)

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

var Q = require('q');

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

async()
.then(function() {
    console.log('async called back');
});
Run Code Online (Sandbox Code Playgroud)

你可以像这样写得更短

Q.delay(1000)
    .then(function() {
        console.log('async called back');
    });
Run Code Online (Sandbox Code Playgroud)

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

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

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