Q承诺 - 如何使用它?

时间:2016-10-01 14:01:15

标签: node.js promise q

我是Node的新手,想要调用一个函数,并根据第一个函数的结果确定是否调用下一个函数。这些函数是异步的,因此结果不是立即知道的。下面的代码工作正常,但现在我想添加更多的异步函数并将它们链接在一起。

var doSomething = require('./custom-module1.js'); //returns a boolean
var doAnotherThing = require('./custom-module2.js'); //returns a double

var var1 = process.argv[2];
var var2 = process.argv[3];
var var3 = process.argv[4];

doSomething(var1, var3, function(data) {
    if (data) {
        doAnotherThing(var1,var2, function(data){
            console.log(var1 + ' is value: ' + data);
        });
    }
});

我想使用promises来制作类似的代码。

getListOfStuff()
.then(
    for(i=0;i<data.length;i++) {
        doSomething(data[i], var3)
        .then(
          if (doSomething returns true) {
            doAnotherThing(data[i], var2)
            .then(doYetAnotherThing(data[i]))
            .then(andEvenMoreThingsToBeDone(data[i]))
          }
        );
    }
);

我读到了关于q和使用denodefiy但我无法理解使其工作的语法。是否最好修改我的自定义模块以返回承诺,以便它们本身就可以找到?我得到了概念而不是语法,我该怎么做呢?

我尝试使用以下两种不同的符号进行去极化。

var doSomethingDN = Q.denodeify(doSomething);
var doAnotherThingDN= Q.denodeify(doAnotherThing);

doSomethingDN(var1, var3)
.then(
    if(!data) {
        doAnotherThingDN(var1,var2)
    }
);

这一个

var doSomethingDN = Q.nfbind(doSomething);
var doAnotherThingDN= Q.nfbind(doAnotherThing);

doSomethingDN (var1, var3)
.then(
    if(!data) {
        doAnotherThingDN(var1,var2)
    }
);

if get是一个意外的令牌错误。如果我删除然后两个运行,但doSomething的布尔结果无法控制程序流。

1 个答案:

答案 0 :(得分:0)

你仍然需要使用promises的回调函数:

doSomethingDN (var1, var3)
.then(function(data) {
//    ^^^^^^^^^^^^^^^^
    if (!data) {
        return doAnotherThingDN(var1,var2)
    }
}); /*
^

您收到语法错误,因为您将函数体作为参数放到then