如果不诉诸反思,我正在寻找的东西可能是不可能的.如果是这样的话,我仍然想知道最好的解决方法.
从本质上讲,这就是我希望我的代码看起来像:
var instance = new MyClass();
instance.Add<int, string>(x => x.ToString());
instance.Add<string, Warehouse>(x => Warehouse.LookupByName(x));
instance.Add<Warehouse, IList<Supplier>>(x => x.Suppliers());
instance.Chain(3); // should call each lambda expression in turn
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何在MyClass的列表中存储这些具有不同签名的代理?以后我怎么能在我想要的时候调用它们,使用每个的返回值作为下一个的输入参数?
MyClass的内部很可能是List的混乱和所有这一切.但我甚至不确定从哪里开始.
(原来,我想打电话new MyClass<int, string, Warehouse, IList<Supplier>>().但是,由于没有"类型参数数组",我放弃了这种方法.)
我正在尝试使用 npx 执行作用域包。似乎唯一的方法是直接指定包,例如:
npx -p @foo/bar bar
Run Code Online (Sandbox Code Playgroud)
这将正确下载@foo/bar并运行bar我的package.json“bin”部分中的条目:
"bin": {
"bar": "./cli.js"
}
Run Code Online (Sandbox Code Playgroud)
但是,我真正想要的是输入:
$ npx @foo/bar
npx: installed 1 in 4s
npx: command not found: bar
Run Code Online (Sandbox Code Playgroud)
我试过@foo/bar, foo/bar,bar在该bin部分中,没有运气。npx 是否支持这样的作用域包?
我在这里可能会遗漏一些确实很明显的东西,但是如何使用如下所示util.promisify的函数呢?
function awkwardFunction (options, data, callback) {
// do stuff ...
let item = "stuff message"
return callback(null, response, item)
}
Run Code Online (Sandbox Code Playgroud)
我可以这样称呼它:
awkwardFunction ({doIt: true},'some data', (err, result, item) => {
console.log('result')
console.log(result)
console.log('item')
console.log(item)
done()
})
Run Code Online (Sandbox Code Playgroud)
再回来
result
{ data: 'some data' }
item
stuff message
Run Code Online (Sandbox Code Playgroud)
使用承诺版本时:
let kptest = require('util').promisify(awkwardFunction)
kptest({doIt: true},'some data')
.then((response, item) => {
console.log('response')
console.log(response)
console.log('item')
console.log(item)
})
.catch(err => {
console.log(err)
})
Run Code Online (Sandbox Code Playgroud)
并尝试同时访问“响应”和“项目”,似乎第二个参数被忽略了...
result
{ data: 'some data' }
item
undefined …Run Code Online (Sandbox Code Playgroud)