不能将lodash部分应用于使用bluebird promisifyAll创建的功能

时间:2015-07-26 17:04:07

标签: javascript function lodash bluebird

下面的代码采用对象lib中的所有方法并将它们作为promisify。然后我可以使用回调样式函数作为承诺,这是有效的。然后我使用_.partial提供函数和参数,这将返回一个函数。当我调用该函数时,它会抛出错误而不是包装函数。我有一大堆测试here表明这种行为只发生在使用promisifyAll生成的函数中。这里有什么问题,如何解决?

var Promise = require("bluebird")
var _ = require("lodash")

var lib = {}

lib.dummy = function(path, encoding, cb){
  return cb(null, "file content here")
}

Promise.promisifyAll(lib)

lib.dummyAsync("path/hello.txt", "utf8").then(function(text){
  console.log(text) // => "file content here"
})

var readFile = _.partial(lib.dummyAsync, "path/hello.txt", "utf8")

readFile() // throws error

投掷

Unhandled rejection TypeError: Cannot read property 'apply' of undefined
    at tryCatcher (/Users/thomas/Desktop/project/node_modules/bluebird/js/main/util.js:26:22)
    at ret (eval at <anonymous> (/Users/thomas/Desktop/project/node_modules/bluebird/js/main/promisify.js:163:12), <anonymous>:11:39)
    at wrapper (/Users/thomas/Desktop/project/node_modules/lodash/index.js:3592:19)
    at Object.<anonymous> (/Users/thomas/Desktop/project/issue.js:18:1)
    at Module._compile (module.js:426:26)
    at Object.Module._extensions..js (module.js:444:10)
    at Module.load (module.js:351:32)
    at Function.Module._load (module.js:306:12)
    at Function.Module.runMain (module.js:467:10)
    at startup (node.js:117:18)
    at node.js:946:3

然而这完全正常。

var dummyPromise = function(path, encoding){
  return Promise.resolve("file content here")
}

var readFile = _.partial(dummyPromise, "path/hello.txt", "utf8")

readFile().then(function(text){
  console.log(text) // => "file content here"
})

2 个答案:

答案 0 :(得分:4)

复制答案from the issue tracker

问题是wp.media未保留_.partial时所需的this值。您可以改为使用promisifyAll,也可以使用适当的lodash方法promisify

_.bind

http://jsfiddle.net/hczmb2kx/

答案 1 :(得分:1)

PFUser会创建期望在原始实例上调用的方法(因为它会调用原始的promisifyAll方法),但.dummy不会绑定您传入的函数,所以你收到partial错误。您可以使用thisreadFile.call(lib),也可以只使用_.partial(lib.dummyAsync.bind(lib), …)