使用$ q.when来解决承诺?

时间:2016-03-02 09:05:05

标签: angularjs angular-ui-router

我对使用$ q.when有一些疑问。这是我的代码:

这是我的代码:

lru_cache()

有人可以就如何做到这一点给我一些建议吗?这是我的一个想法,但我不确定这是不是应该这样做。特别是我不确定是否需要包含resolve: { get: ['$q','testService','$stateParams', ($q,tes,$stateParams) => { // I am doing a check here to see if the qs // array has been populated. If it has then // I want to return a resolve. If not then // I want to return getQuestions() $q.when($stateParams.qs); // getQuestions() will return a promise }] }, 并且还不确定在第一个$的解析部分中我是否需要第二个$。

return

2 个答案:

答案 0 :(得分:3)

$q.when(someVariable)用于将数据包装在已经解析的promise中,并在返回时将其传递给promise链

解决时如此

resolve: {
    get: function(response) {
        return $q.when(response.data);
    }
}

你需要返回承诺,否则你将破坏链条,下面的代码将无法正常运行。

你基本上将一个已解决的promise对象传递给你的控制器,所以在你的控制器中你可以把它链接到另一个then

控制器内部:

get.then(function(data) {
    console.debug("this is my raw data: ", data);
}, function(rejected) {
    // this won't run
}

$q docs涵盖此功能

编辑1

所以你的解析代码应该是这样的

    resolve: {
        get: ['$q','testService','$stateParams', ($q,tes,$stateParams) => { 
             return $q.when($stateParams.qs);  
      }]
    },

并在控制器内部

get.then(() => {
             return "success";
         }, 
         () => {
             return getQuestions();
         })

但是因为你已经返回$ q.when(总是被解析),所以行return getQuestions();永远不会运行。所以你应该在解决方案中移除$ q.when。

编辑2

如果您希望qs之后getQuestion解决,那么就这样做

resolve: {
    get: function(response) {
        return $q.when("success"); // or just return "success"
    }).then(function(response) {
        if (response==="success") { // you can skip it
            return $q.when(getQuestions());
        } else {
            return $q.reject("Some error"); // a throw would work the same
        }
    })
}

如果你不介意订单使用$ q.all

get: function() {
    return $q.all(["success", getQuestions()]).then(function(results) {
        var res1 = results[0]; // success
        var res2 = results[1]; // the questions
)}

答案 1 :(得分:0)

这似乎对我有用:

resolve: {
   get: ['$q','testService','$stateParams',
         ($q,tes,$stateParams) => { 
             if ($stateParams.qs) {
                return $q.when();
             else {
                return getQuestions();
             }
 },