将基于回调逻辑的库函数集成到promise链中

时间:2017-03-01 13:09:09

标签: javascript angularjs promise angular-promise q

要处理我返回的承诺,并将其与.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));

我觉得我可以将外部库函数包装在一个可链接的函数中(一个返回一个promise),然后使用the library q推迟并解析回调函数,但是我被卡住,因为我不知道实际实现它。或者还有另一种方式吗?

PS以防它有所不同,这是在angularjs应用

1 个答案:

答案 0 :(得分: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; 
}