【问题标题】:What to do when a promise cannot be passed down to a thirdparty library?当 Promise 无法传递给第三方库时该怎么办?
【发布时间】:2014-11-20 05:48:27
【问题描述】:

我正在使用 node.js 库 nomnom 进行命令行解析和bluebird 的承诺。

Nomnom 提供通过回调执行commands。不幸的是,回调不支持返回承诺。

我想知道,处理这种接口不匹配的最佳方法是什么? 在这种情况下,我正在考虑添加一个繁忙的循环,直到一个承诺被解决/拒绝(使用 isPending )。 有没有更好的办法?

var parser = require("nomnom");
parser.command('somecommand').callback(function(opts) {
  var p = thisFuncReturnsAPromise();
  //have to block here since
  //nomnom expects at the end of the callback that processing of the command is done.
})

【问题讨论】:

  • 只需编写一个匿名 then 方法并使用内部参数调用回调。不要阻止。
  • 你会答应的。这是一个很好的问题 - 让我快速找到副本。
  • 不确定如何承诺。添加示例代码以使案例更加清晰。
  • 我不认为在这种情况下这是重复的,因为 nomnom 需要回调。
  • 我认为@Bergi 在这里有关键的洞察力。为了更好地理解“不可能”这个词,我深入研究了 bluebirds 代码和 Node.js 异步处理 API。它不允许通过 process.nextTick 调度的任何函数在另一个函数期间执行。由于 bluebird 通过 process.nextTick 执行解析,因此在不更改 3rd 方库的情况下无法等待这种情况发生。唯一的方法是如果 node.js 提供了类似“process.executeEveryThingThatWasScheduledForNextTickNow()”这样的 API。

标签: javascript node.js promise


【解决方案1】:
var promise = new Bluebird(function(resolve, reject) { //Create a promise
    myLib.doStuff(function() {
        resolve(); //In a callback you resolve the promise
    });
}); 

promise.then(function() { //Use the promise
    console.log('Stuff done');
});

【讨论】:

  • 在 BB 中可不是这样的。
  • 为BB行为改了,这样对吗?但重点是,在回调中解决 promise。
  • 不,bluebird 将在整个模块上执行Promise.promisifyAll 并在单个命令中将其转换为投诉 API,假设它使用正确的节点约定进行回调。请参阅我作为骗子关闭的问题。
  • @BenjaminGruenbaum 请查看示例代码。我不认为这是一个骗局。
  • @BenjaminGruenbaum 案例 2 描述了我可以控制需要回调结果的代码的情况。在这里,角色互换了。我提供回调,nomnom可以在回调完成后执行代码。
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多