6

我想做类似的事情:

somePromiseFunc(value1)
.then(function(value2, callback) {
    // insert the next then() into this function:
    funcWithCallback(callback);
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

它没有用。我无法让它工作。我被建议defer()用于此目的。

他们自己的文档说我们应该为回调风格的函数使用延迟。虽然这很令人困惑,因为他们著名的扁平化金字塔示例都是关于回调的,但是这个示例太抽象了,无法理解。

因此,我看到很多人使用defers,这就是我所做的:

somePromiseFunc(value1)
.then(function(value2) {
    var promise = q.defer();

    funcWithCallback(function(err, dronesYouAreLookingFor){
        if (!err)
            promise.resolve(dronesYouAreLookingFor);
        else
            promise.reject(new Error(err));
    });
    return promise.promise;
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

直到我通过检查源代码发现这也有效:

somePromiseFunc(value1)
.then(function(value2) {
    return function() {
        funcWithCallback(arguments[1]);
    };
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

为什么我不应该使用这个更简单的无证版本?

未记录,因为虽然这看起来像扁平化金字塔所做的那样,return function(){withCB(arguments[1])}return function(err, cb){withCB(cb)}实际上不起作用。

4

1 回答 1

9

这不是使用 Promise 库的合法方式。正如Q 旨在遵守的承诺规范.then中详述的那样,您从回调返回的任何不是承诺的东西都应该直接传递。

本质上,基于回调的代码应该被视为legacy当您使用 Promise 时。

你有两个基本的选择。如果您多次使用 funcWithCallback ,您可以执行以下操作:

var promisedFunc = Q.nfbind(funcWithCallback);

somePromiseFunc(value1)
.then(function(value2) {
    return promisedFunc();
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

或者如果您需要传递参数:

var promisedFunc = Q.nfbind(funcWithCallback);

somePromiseFunc(value1)
.then(function(value2) {
    return promisedFunc(value1, value2);
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

如果你只使用一次你可以做

somePromiseFunc(value1)
.then(function(value2) {
    return Q.nfcall(funcWithCallback);
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();

或者如果您需要传递参数:

somePromiseFunc(value1)
.then(function(value2) {
    return Q.nfcall(funcWithCallback, value1, value2);
})
.then(function(dronesYouAreLookingFor){
    // Have a party
})
.done();
于 2013-01-23T16:35:30.100 回答