Restangular:等待承诺的决心?

时间:2014-09-04 19:29:36

标签: javascript angularjs promise restangular

我是Javascript和AngularJS的新手,这个让我抓狂:/

前提条件

  • 从后端提供我的数据的REST服务
  • AngularJS 1.2.21和Restangular 1.4.0
  • AngularJS控制器,应向服务部门询问所提供的
  • 的加香版本

我有什么

这是有问题的方法:

   service.getSlices = function() {

        Restangular.all('entries').getList().then(function(entries) {

            //some rather complex modification of the backend data go here
            //...

            return  resultOfModification; //this is what should be returned for getSlices();
        })

        //I want the resultOfModification to be returned here


    };

问题

基本上我想在getSlices()等待,直到承诺得到解决,才能在实际计算时返回resultOfModification

其他方案
我还可以想象来自getSlices()的承诺,然后提供resultOfModification。但是我担心我对此不太了解和/或同时感到非常沮丧/疲惫。

答案和任何建议都是受欢迎的,特别是指向好的阅读材料。感谢

1 个答案:

答案 0 :(得分:10)

您无法在该位置将其作为实际值返回,因为Restangular是异步的(在调用传递给getSlices的回调之前,函数then会被调用)。这就是使用Promise的原因。

即使可以使Restangular同步,也不应该这样做,因为这会阻止浏览器直到请求数据,这将是一个糟糕的用户体验。

您应该尝试进入Promise,因为它们的设计看起来像同步代码但行为异常。

您需要在代码中更改的内容是在return之前添加Restangular.all

  service.getSlices = function() {
      return Restangular.all('entries').getList().then(function(entries) {

          //some rather complex modification of the backend data go here
          //...

          return  resultOfModification; //this is what should be returned for getSlices();
      })
  };

这将返回Promise来电返回的.then。此承诺将解析为resultOfModification,因为这是您从其回调中返回的值。

这样你可以用getSlices方式:

  service.getSlices().then(function(modifiedData) {

  });

承诺可以链接起来:

  (new Promise(function( resolve, reject){
    setTimeout(function() {
      resolve("some");
    },200);
  }))
  .then(function(data) {
    return data+' data';
  })
  .then(function(data) {
    //here a Promise is return which will resovle later (cause of the timeout)
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        resolve(data+' !!!!!!');
      },200);
    });
  })
  .then(function(data) {
    //this will have 'some data !!!!!!'
    console.log(data);
  });

这与你用这种方式写的一样:

  var promiseA = new Promise(function( resolve, reject){
    setTimeout(function() {
      resolve("some");
    },200);
  });

  var promiseB = promiseA.then(function(data) {
    return data+' data';
  })


  var promiseC = promiseB.then(function(data) {
    //here a Promise is return which will resovle later (cause of the timeout)
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        resolve(data+' !!!!!!');
      },200);
    });
  });

  var promiseD = promiseC.then(function(data) {
    //this will have 'some data !!!!!!'
    console.log(data);
  });