2

我正在使用when.js库学习承诺,使用when.mapnodefs.readFile让我觉得我错过了一些东西。 fooPromise 在作为单个 Promise 调用时可以正常工作,但在用作映射器函数时会失败,when.map因为 index 作为第三个参数注入(然后回调作为第 4 个参数传递)。

API doc 说when.map映射器函数需要有两个参数。那么 mapper 函数可以写成bar,它可以在任何上下文中工作。

var when = require('when');
var node = require('when/node');
var _ = require('lodash');

// readFile has the same signature as fs.loadFile
function readFile(param1, param2, callback) {
  console.log(Array.prototype.slice.call(arguments));
  callback(null, [param1, param2]);
}

var foo = _.partialRight(node.lift(readFile), 'base64');

var bar = function (fileName, index) {
  return node.lift(readFile)(fileName, 'base64');
};

when.map(['1', '2'], bar).done(); // works
when.map(['3', '4'], foo).done(); // does not work

有没有更优雅的方法来编写bar函数?

4

1 回答 1

0

我认为您误解了 partialRight 函数的含义。Lodash 文档说明 partialRight

此方法与 _.partial 类似,只是将部分参数附加到提供给新函数的参数。

您可能认为它与右侧相同curry但从右侧开始,但事实并非如此!它只会将额外的参数附加到参数列表的右侧:

function baz() {
    console.log(arguments)
}

var qux = _.partialRight(baz, 'should be second parameter, but is not')

console.log(qux("first parameter", "second parameter, should be ignored, but it's not!"))

产生:

{ '0': 'first parameter',   '1': 'second parameter, should be ignored,
but it\'s not!',   '2': 'should be second parameter, but is not' }

在 lodash 3.0.0-pre 中有curryRight你应该尝试的功能,在 lodash 2.4.1 中没有这样的功能,所以我使用哑交换:

var when = require('when');
var node = require('when/node');
var _ = require('lodash');

function readFile(param1, param2, callback) {
  console.log(Array.prototype.slice.call(arguments));
  callback(null, [param1, param2]);
}


/* Swaps arguments of function with two arguments*/
function swap(f) {
    return function (a,b) {
        return f(b,a);
    }
}



var foo = _.curry(swap(node.lift(readFile)))("base64")



var bar = function (fileName, index) {
  return node.lift(readFile)(fileName, 'base64');
};



when.map(['1', '2'], bar).done(); // works
when.map(['3', '4'], foo).done(); // does work

顺便说一句,感谢简短、独立、正确的示例!

于 2015-01-16T20:18:12.687 回答