我有一个非常愚蠢的问题。请考虑以下事项:
vm.feed = getFeed().then(function(data) {return data;});
getFeed()
返回成功解析的$ q延迟承诺(我处于角度)。
我的目标是将vm.feed设置为等于成功回调返回的数据值。就像现在一样,代码只是将vm.feed指定为$promise
返回的getFeed()
对象。
我知道我可以在已解决的函数中执行:vm.feed = data
但我想了解为什么此代码不能正常工作。
PD:promise正确解析,即使在解析后,vm.feed仍然等于Promise,而不是数据。我在+10秒后复制了v..ed的console.log:
Promise {$$state: Object} $$state: Objectstatus:1 value: Object
Promise对象中的value属性包含我想要分配给vm.feed(e.i。data
)的promise的实际解决方案。
答案 0 :(得分:18)
您的陈述只是要求口译员将then()
返回的值分配给vm.feed
变量。 then()
会向您返回一个承诺(正如您在此处看到的那样:https://github.com/angular/angular.js/blob/master/src/ng/q.js#L283)。你可以通过看到Promise(一个简单的对象)拉退出函数并被分配到vm.feed
来描绘这一点。只要解释器执行该行,就会发生这种情况。
由于成功回调在您调用then()
时没有运行,但只有当您的承诺得到解决时(稍后,异步),then()
才能为调用者返回其值。这是Javascript的默认方式。这就是Promise引入的确切原因,因此您可以要求解释器以回调的形式推送给您的值。
虽然正在为JavaScript工作的未来版本(ES2016)中引入了几个关键字,但正如您现在所期望的那样。好消息是,您可以通过从ES2016转发到当前广泛支持的版本(ES5),开始编写这样的代码。
有关该主题的精彩介绍,请访问:https://www.youtube.com/watch?v=lil4YCCXRYc
要立即使用它,您可以通过Babel https://babeljs.io/docs/usage/experimental/(通过与--stage 1
一起运行)来转换代码。
您还可以在此处查看一些示例:https://github.com/lukehoban/ecmascript-asyncawait。
答案 1 :(得分:15)
可以使用箭头功能将其更新为ES6,如下所示:
getFeed().then(data => vm.feed = data);
如果您想使用async function
,您也可以这样做:
async function myFunction(){
vm.feed = await getFeed();
// do whatever you need with vm.feed below
}
答案 2 :(得分:10)
then()
方法返回Promise。它需要两个参数,都是Promise成功和失败案例的回调函数。 promise对象本身并不直接为您提供已解析的数据,此对象的接口仅通过提供的回调提供数据。所以,你必须这样做:
getFeed().then(function(data) { vm.feed = data;});
then()
函数返回带有前一个then()
回调的已解析值的promise,允许您将值传递给后续回调:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved
// and its value will be the result of promiseA incremented by 1
答案 3 :(得分:0)
您可以为函数提供对象及其属性。接下来,在函数中执行您需要做的事情。最后,将Promise中返回的值分配给对象中的正确位置。这是一个示例:
let myFunction = function (vm, feed) {
getFeed().then( data => {
vm[feed] = data
})
}
myFunction(vm, "feed")
如果需要,您还可以编写自调用功能。
答案 4 :(得分:0)
这是您可以执行的一项“技巧”,因为您退出了异步功能,因此无法使用等待键操作
使用setTimeout中的vm.feed做你想做的事情
vm.feed = getFeed().then(function(data) {return data;});
setTimeout(() => {
// do you stuf here
// after the time you promise will be revolved or rejected
// if you need some of the values in here immediately out of settimeout
// might occur an error if promise wore not yet resolved or rejected
console.log("vm.feed",vm.feed);
}, 100);