我正在尝试了解Promises。我创建了一些行之有效的 promise 链,另一些行不通。我已经取得了进步,但显然缺乏基本概念。例如,以下promise链不起作用。这是一个愚蠢的例子,但显示了问题。我试图在链中两次使用Node的函数randomBytes:

var Promise = require("bluebird");
var randomBytes = Promise.promisify(require("crypto").randomBytes);

randomBytes(32)
.then(function(bytes) {
    if (bytes.toString('base64').charAt(0)=== 'F') {
        return 64;   //if starts with F we want a 64 byte random next time
    } else {
        return 32;
    }
})
.then(randomBytes(input))
.then(function(newbytes) {console.log('newbytes: ' + newbytes.toString('base64'));})

此处出现的错误是“input未定义”。我是否在尝试做无法(或不应该)做的事情?

最佳答案

您始终需要将回调函数传递给then()。它将以您附加它的 promise 的结果被调用。

您当前正在立即调用randomBytes(input),如果已经定义了input,则该调用(如果已定义input)。您需要传递一个仅将ojit_code作为其参数的函数表达式:

.then(function(input) {
    return randomBytes(input);
});

或者只是直接传递函数本身:
randomBytes(32)
.then(function(bytes) {
    return (bytes.toString('base64').charAt(0)=== 'F') ? 64 : 32;
})
.then(randomBytes)
.then(function(newbytes) {
    console.log('newbytes: ' + newbytes.toString('base64'));
});

09-18 12:24