Javascript 解决承诺而不调用';然后';

Javascript 解决承诺而不调用';然后';,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我有这段代码,它是我为一个名为Poolio的NPM模块编写的一个小API的一部分。对于那些支持错误优先回调和承诺的人来说,我的问题似乎是一个常见的问题——我们如何在维护一致发送的API和来自API的一致返回值的同时支持这两者?例如,如果我有条件地从API返回一个承诺,这取决于我的库的使用者是否提供回调,我认为这有点尴尬 lib的使用者可以提供回调或使用Promise-then函数,但不能同时提供回调和Promise-then函数 下面是我的库导出的一个函数,我想说明一下: Pool.protot

我有这段代码,它是我为一个名为Poolio的NPM模块编写的一个小API的一部分。对于那些支持错误优先回调和承诺的人来说,我的问题似乎是一个常见的问题——我们如何在维护一致发送的API和来自API的一致返回值的同时支持这两者?例如,如果我有条件地从API返回一个承诺,这取决于我的库的使用者是否提供回调,我认为这有点尴尬

lib的使用者可以提供回调或使用Promise-then函数,但不能同时提供回调和Promise-then函数

下面是我的库导出的一个函数,我想说明一下:

Pool.prototype.any = function (msg, cb) {

    var workId = this.counter++;
    var self = this;

    return new Promise(function (resolve, reject) {

        if (typeof cb === 'function') {
            self.resolutions.push({
                workId: workId,
                cb: cb
            });
        }
        else {
            self.resolutions.push({
                workId: workId,
                resolve: resolve,
                reject: reject
            });
        }

        if (this.available.length > 0) {
            var cp = this.available.shift();
            cp.workId = workId;
            cp.send(msg);
        }
        else {
            self.msgQueue.push({
                workId: workId,
                msg: msg
            });
        }
    });

};

我的问题是-如果用户在原始函数参数中提供回调函数,我如何在不调用“then”的情况下解析承诺? 抱歉,很难解释,但希望你能理解

还有一个有趣的问题:

这实际上非常简单。只有您可能会错过它,因为它隐藏在混乱的代码中

基本上你是这样做的:

var promise = new Promise(function (resolve, reject) { /*....*/});

if (typeof cb === 'function') {
    promise.then(cb);
} else {
    return promise;
}

实际上,这是API做的一件非常常见的事情()。基本上,编写一个接受回调的私有函数,编写一个检查cb的公共函数,并在必要时编写它。使用github中的代码(
\u任何
都可能需要重构,例如,您不需要检查cb是否是函数,也可能是其他东西):


解决承诺与
无关,然后
。。。承诺可以独立于在ITI上调用的任何
then
回调进行解析如果在承诺上调用了then,那么从承诺内部调用resolve应该调用所有附加的then,对吗?换句话说,如果没有thens,那么调用resolve应该没有效果,但是如果有thens,那么应该调用那些thens。我的问题是如何避免打电话给他们。是的,任何then的“附件”在解决后都会被称为“立即”(用引号括起来,因为它没有那么清楚)
我的问题是如何避免打电话给他们
-啊,我明白了!抱歉,完全没有回答您的问题如果用户提供回调函数,那么您不会将解析/拒绝函数“推”到解析中,因此您永远无法调用解析HMMM这是一个错误优先回调,如果有错误,它会出现在正确的地方吗?这完全忽略了任何
自我决议。
不会(我不明白这是怎么回事)是的,这对我的情况不起作用,我也不确定它是否正确。如果你好奇的话,这就是问题中的库:这是没有承诺的原始库:这是有承诺的新库:如果没有回调,那么调用
pool.any()。那么()
将不起作用。@slebetman
return new promise()
似乎在向我回报承诺。OP可以检查
msg
是否存在于
\u any()
中,我概述了不使用完整错误检查编写整个代码的想法。
 // private function
var _any = function(msg, cb) {
  if (this.kill) {
    console.log('warning: pool.any called on pool of dead/dying workers');
    return;
  }

  debug('current available pool size for pool_id ' + this.pool_id + ' is: ' + this.available.length);
  var workId = this.counter++;

  if (typeof cb === 'function') {
    this.resolutions.push({
      workId: workId,
      cb: cb
    });
  } else {
    workId = -1;
  }

  if (this.available.length > 0) {
    var cp = this.available.shift();
    cp.workId = workId;
    cp.send(msg);
  } else {
    this.msgQueue.push({
      workId: workId,
      msg: msg
    });
  }
};

 // public exposed function
Pool.prototype.any = function(msg, cb) {
  if (typeof cb === 'function') {
    // cb is provided, no action is required here
    return _any(msg, cb);
  } 

  // no cb, wrap the call inside a Promise and provide a cb
  return new Promise(function(resolve, reject) {
    _any(msg, function(err, data) {
      if (err) reject(err);
      else resolve(data);
    });
  });
}