【发布时间】:2018-03-12 17:27:06
【问题描述】:
我正在使用另一个库 (THREE.js),它对几个加载器使用单值回调。我想从 Promise 中调用它们并将值传递到链中。
我已经从以前的方法中得到了一个承诺,所以我想继续这个链条。这给了我类似的东西:
var callStuff = (input, callback) => {
// open some files and create some buffers
// callback with buffer handles
setTimeout(callback, 1000, input + 2);
};
new Promise((resolve, reject) => {
resolve(1);
}).then(result => {
callStuff(result, value => {
console.log("callback:", value);
return value;
});
}).then(newResult => {
console.log("newResult: ", newResult);
return newResult;
});
请注意,这是一个简化版本,所以我可以把它放在这里。
如何从回调中获取返回值newResult?
我知道我可以使用 [Bluebird 的 .asCallback][1] 之类的东西,但是我必须 catch 来获取我想要的数据,因为这些库不使用 Node 样式的回调。有什么方法可以得到我想要的返回值吗?
谢谢!
更新:我确实找到了一种解决方法,方法是将回调包装在 new Promise 中,然后将 resolveing 包装在回调中,但这感觉像是作弊。如果可能的话,我希望找到一种更好/更合乎逻辑的方式。
var callStuff = (input, callback) => {
// open some files and create some buffers
// callback with buffer handles
setTimeout(callback, 1000, input + 2);
};
new Promise((resolve, reject) => {
resolve(1);
}).then(result => {
return new Promise((resolve, reject) => {
callStuff(result, value => {
console.log("callback:", value);
resolve( value );
});
});
}).then(newResult => {
console.log("newResult: ", newResult);
return newResult;
});
更新 2:澄清一下,我无法编辑执行回调(回调?)的函数,因为它是一个库,我宁愿挖掘那里的代码进行更改。
【问题讨论】:
-
让
callStuff返回一个promise 而不是回调。如果您无法编辑其代码,则将其包装在new Promise中正是要走的路——这根本不是作弊。如果您不喜欢它的外观,请将其移至辅助函数中。 -
您介意将其与任何参考资料一起放入答案中吗?谢谢!
标签: javascript callback promise bluebird