【问题标题】:Integrate a callback logic based library function into promise chain [duplicate]将基于回调逻辑的库函数集成到承诺链中[重复]
【发布时间】:2017-07-20 20:03:19
【问题描述】:

为了处理承诺,我返回并用.then() 链接它们。但是,我必须使用期望回调且不返回承诺的第三方库。

为了清楚起见,一个假的例子:

person.sayHello()
    .then( response => introduceMyself() )
    .then( name => externalLibrary.storeAndGetInfo(name) )
    .then( info => saySomeInfo(info) )
    .catch( err => console.log(err) );

introduceMyself(){
   return asyncFunctionToGetAndSayMyName();
}

sayDomeInfo(info){
    console.log(info);
}

我的问题是externalLibrary.storeAndGetInfo 需要这些参数:

storeAndGetInfo(string, callback(valueThatINeedForMyNextChainedFunction));

我觉得我可以将外部库函数包装在一个可链接的函数中(一个返回承诺的函数),然后使用 the library q 来推迟和解决回调函数,但后来我被卡住了因为我不知道实际实施它。还是有别的办法?

PS 以防万一,这是在 angularjs 应用程序中

【问题讨论】:

  • 对于 AngularJS 框架,使用 Angular's $q Library 来做出与 AngularJS 摘要循环集成的承诺。来自外部库的 Promise 会导致微妙的难以调试的问题。

标签: javascript angularjs promise angular-promise q


【解决方案1】:

你应该用一个返回延迟承诺的函数来包装你的外部库的调用:

function promisedStore (name) {
  var deferred = Q.defer(); //initialize deferred

  externalLibrary.storeAndGetInfo(name, function(error, result) {
    if (error) {
      deferred.reject(new Error(error)); //reject promise if error in cb
    } else {
      deferred.resolve(result); //resolve promise if no error in cb
    }
  });

  return deferred.promise; 
}

【讨论】:

  • 是的,就是这样!我很接近,但还不够接近 :-) 将在 7 分钟内接受
  • 对于 AngularJS 框架,使用 AngularJS $q Library 来做出与 AngularJS 摘要循环集成的承诺。来自外部库的 Promise 会导致微妙的难以调试的问题。
猜你喜欢
  • 2019-12-27
  • 2017-08-12
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 2020-08-26
相关资源
最近更新 更多