将参数的顺序交换为"然后"与Bluebird / NodeJS承诺

时间:2016-05-27 14:50:26

标签: javascript node.js promise bluebird fs

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

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期望参数1是文件,参数2是数据,但getValue()返回数据。这是错误的说法:

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

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

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

虽然如果没有编写一个首选的帮助函数就可以解决这个问题,因为我预计会出现很多类似的问题,并且不想用50个辅助函数来混淆我的代码。我也觉得从承诺传递数据到writeFile可能是一个非常常见的用例。

1 个答案:

答案 0 :(得分:2)

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

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

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

请注意,.bind()的第一个参数是this参数,这并不重要。