我是Javascript和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
。但是我担心我对此不太了解和/或同时感到非常沮丧/疲惫。
答案和任何建议都是受欢迎的,特别是指向好的阅读材料。感谢
答案 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);
});