2017-01-20 5 views
1

У меня есть метод на сервере WebApp с помощью узла, который будет выполнять несколько асинхронных действий, например:Бросить разные ошибки в цепочку обещаний?

function saveTopValuePages(pageSize, clientId ) 
     setExistingCredentials(clientId) 
     .then(function() { 
      return getViewIdByClientId(clientId); 
     }, function(error) { 
      throw new customErrors.SetExistingCredentials('test123') 

     }) 
     .then(function(viewId) { 
      return fetch(viewId, options) 
     }, function(error) { 
      throw new customErrors.GetViewIdByClientId('abcasdasd') 
     }) 
     .then(function(response) { 
      return response; 
     }) 

После этого будет мой вызовом этого функция из моих маршрутов:

analytics.saveTopValuePages(pageSize, clientId) 
    .then(function(data) { 
     res.status(200)send({ message: 'success'}) 
     } 

    }).catch(customErrors.SetExistingCredentials, function(error) { 
     res.status(400).send({ error: error}) 
    }).catch(customErrors.GetViewIdByClientId, function(error) { 
     res.status(401).send({error: error}) 
    }).catch(function(e){ 
    res.status(500).send({ error: "Unknown internal server error" }); 
}); 

Как вы можете см. в моем примере, я пытаюсь выбросить ошибку в зависимости от того, какая часть процесса завершилась неудачно. Это будет работать, если все эти действия будут независимо друг от друга, но наоборот. Таким образом, если setExistingCredentials не работает, все следующие функции потерпят неудачу.

Это вызывает то, что если setExistingCredentials не удался, ошибка будет выбрана, а также ошибка GetViewIdByClientId. Наконец, ошибка, которую я поймаю, будет последней (GetViewIdByClientId в этом случае), а не правильной.

Итак, я не уверен, был ли это правильный подход, если есть какой-либо другой образец обещаний для достижения нужных мне результатов.

Заранее благодарен!

+0

почему вы не использовать нативную ошибку? 'var error = new Error (« Ошибка произошла »); throw error; ' – DomeTune

+0

Я пытаюсь использовать этот подход раньше, но это то же самое, последняя ошибка - это то, что было распространено на catch, поэтому оно всегда является ошибкой« getViewIdByClientId ». – Nicolas

+0

Как будут выполняться последующие операции, если они зависят от броска? –

ответ

-1

Не знаю, как «кошерного» это

function saveTopValuePages(pageSize, clientId ) { 
    setExistingCredentials(clientId) 
    .then(function() { 
     return getViewIdByClientId(clientId); 
    }) 
    .catch(function(error) { 
     throw { custom: customErrors, type: 'SetExistingCredentials', arg: 'test123' } 

    }) 
    .then(function(viewId) { 
     return fetch(viewId, options) 
    }) 
    .catch(function(error) { 
     if (error.custom == customErrors) { 
      throw new customErrors[error.type](error.arg); 
     } 
     throw new customErrors.GetViewIdByClientId('abcasdasd') 
    }); 
    // next 3 lines are actually redundant 
    //.then(function(response) { 
    // return response; 
    //}) 
} 

Если это не сработает, то вы не будете, как это - не нравится - но иногда это должно быть сделано - раскрой!

function saveTopValuePages(pageSize, clientId ) { 
    setExistingCredentials(clientId) 
    .then(function() { 
     return getViewIdByClientId(clientId).then(function(viewId) { 
      return fetch(viewId, options) 
     }, function(error) { 
      throw new customErrors.GetViewIdByClientId('abcasdasd') 
     }); 
    }, function(error) { 
     throw new customErrors.SetExistingCredentials('test123') 
    }) 
    .then(function(response) { 
     return response; 
    }) 
} 

Конечно, вы могли бы смягчить эту гадость, создав функцию

function getView(clientId) { 
    return getViewIdByClientId(clientId).then(function(viewId) { 
     return fetch(viewId, options) 
    }, function(error) { 
     throw new customErrors.GetViewIdByClientId('abcasdasd') 
    }); 
} 
function saveTopValuePages(pageSize, clientId ) { 
    setExistingCredentials(clientId) 
    .then(function() { 
     return getView(clientId); 
    }, function(error) { 
     throw new customErrors.SetExistingCredentials('test123') 
    }) 
    .then(function(response) { 
     return response; 
    }) 
} 
+0

Да, я размышлял о том, как можно было найти решение, но я начал работать с обещаниями в последнее время, и мне было интересно, не было ли более элегантного решения/шаблона для обработки подобных случаев. Благодаря! – Nicolas

Смежные вопросы