【问题标题】:How to return value to Promise chain from callback如何从回调返回值到 Promise 链
【发布时间】: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


【解决方案1】:

在你的回调中返回一个?

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>

【讨论】:

  • 那行得通,但是在测试它时,我发现了一个小警告,这是我的实际问题。当回调没有return callback时怎么办?
  • callStuff 返回什么?承诺?
  • 我更新了答案。假设 callStuff 是同步的(没有承诺),你可以这样做。这是你想要的吗?
  • callStuff 是异步的,但它不返回回调,它只调用回调。
  • 您的示例不能说明问题。在那里 callStuff 是同步的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2017-12-20
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2020-08-06
相关资源
最近更新 更多