返回承诺会抛出错误的承诺

时间:2015-10-22 23:12:40

标签: javascript angularjs promise angular-promise

我对使用承诺相当新,我主要坚持直接回调。以下代码恰好在Angular Service中找到,但这并不重要,它主要是关于如何创建一个承诺会抛出某个错误的promise。所以这就是如何将回调结合起来,这可以避免这个问题:

var client = algolia.Client('ApplicationID', 'apiKey');


var indices = {

    users: client.initIndex('users'),
    topics: client.initIndex('topics')

}

return {

   search: function(indexName, searchTerms, cb){
       var index = indices[indexName];

       if(index){
          index.search(searchTerms).then(function handleSuccess(msg){
               cb(null,msg);
            }, function handleError(err){
               cb(err);
            }
       }
       else{
          cb(new Error('no matching index'));
       }

   }

...但改变上述内容以使用纯粹的承诺,我不知道该怎么做:

var client = algolia.Client('ApplicationID', 'apiKey');

var indices = {

    users: client.initIndex('users'),
    topics: client.initIndex('topics')

}

return {

   search: function(indexName, searchTerms){
       var index = indices[indexName];

       if(index){
          return index.search(searchTerms); //returns a promise
       }
       else{
          //if there is no matching index, how can I return a promise then will return an error?
       }

   }

我知道有不同的方法来构建代码以避免手头的问题,但我很好奇是否有办法直接解决它。

2 个答案:

答案 0 :(得分:2)

您只需要使用$q.reject(err)返回被拒绝的承诺:

return {

   search: function(indexName, searchTerms){
       var index = indices[indexName];

       if(index){
          return index.search(searchTerms); //returns a promise
       }
       else{
          // return rejected promise if no match
          return $q.reject(new Error("no matching index"));
       }
   }

文档here

答案 1 :(得分:1)

您可以注入$q服务并返回$q.reject(reason),例如:

return $q.reject('NO_INDEX');

来自$q documentation

  

创建一个以指定原因解析为已拒绝的承诺。