使用 Bluebird / NodeJS Promises 将参数顺序交换为 "then"

Swap order of arguments to "then" with Bluebird / NodeJS Promises

我有一个从服务器异步获取值的函数:

var request = require('request');
Promise.promisifyAll(request);
function getValue(){
    return request.getAsync('http://www.google.com')
        .then(function(resp){ return resp.body; })
        .catch(function(err){ thow err; });
}

我想获取这个值并将其转储到文件中:

var fs = require('fs');
Promise.promisifyAll(fs);
getValue().then(fs.writeFileAsync, "file.html");

问题是 fs.writeFileAsync 期望参数一是文件,参数二是数据,但 getValue() returns 是数据。这是错误的说法:

Unhandled rejection Error: ENAMETOOLONG: name too long, open '<html....'
    at Error (native)

我现在可以通过编写一个辅助函数来交换参数来规避这个问题:

function myWriteFile(data, fileName) {
    return fs.writeFileAsync(fileName, data);
}

虽然如果可以在不编写辅助函数的情况下解决此问题,那将是首选,因为我预计会出现很多类似的问题并且不想让我的代码与 50 个辅助函数混淆。我也觉得从 promise 向 writeFile 传递数据可能是一个非常常见的用例。

.then()函数的第二个参数是错误回调,不是参数。您的代码根本不起作用。

相反,您可以使用.bind预绑定一个参数:

getValue().then(fs.writeFileAsync.bind(null, "file.html"));

注意 .bind() 的第一个参数是 this 参数,这无关紧要。