我对使用承诺相当新,我主要坚持直接回调。以下代码恰好在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?
}
}
我知道有不同的方法来构建代码以避免手头的问题,但我很好奇是否有办法直接解决它。
答案 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');
创建一个以指定原因解析为已拒绝的承诺。