如何从回调中将值返回给Promise链

时间:2018-03-12 17:27:07

标签: javascript callback promise bluebird

我正在使用另一个库(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''sCallback] [1]的内容,但是我必须catch来获取我想要的数据,因为这些库不能使用节点样式回调。有没有办法获得我想要的回报值? 谢谢!

更新:我确实找到了一个解决方法,将回调包装在new Promise中,然后resolve在回调中,但这感觉就像是作弊。如果可能的话,我希望找到一种更好/更合乎逻辑的方式。



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:只是为了澄清,我无法编辑执行回调的函数(回调?),因为它是一个库,我宁愿通过代码进行更改。

1 个答案:

答案 0 :(得分:0)

在回调中做回报吗?



new Promise((resolve, reject) => {
  resolve(5);
}).then(result => {
  let retVal;
  return callStuff(value => {
    console.log(value + result);
    return retVal = value + result;
  }).then(() => retVal);
 
}).then(newResult => {
  console.log(newResult);
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.4.0/bluebird.js"></script>
&#13;
&#13;
&#13;