我有一个很傻的问题。考虑以下:
vm.feed = getFeed().then(function(data) {return data;});
getFeed() 返回成功解决的$ q递延承诺(我在角度上)。
getFeed()
我的目标是将vm.feed设置为等于成功回调返回的数据值。到目前为止,代码只是将vm.feed分配给等于$promise返回的对象getFeed()。
$promise
我知道我可以简单地做到这一点:vm.feed = data在已解析的函数内部,但我想了解为什么此代码无法按原样工作。
vm.feed = data
PD:promise正确解析,即使已解决,但vm.feed仍然等于Promise,而不是数据。+10秒后,我复制了vm.feed的console.log:
Promise {$$state: Object} $$state: Objectstatus:1 value: Object
Promise对象中的value属性包含要分配给vm.feed(ei data)的Promise的实际解决方案。
data
谢谢!
您的发言确实不外乎要求解释分配从返回的值then()的vm.feed变量。then()返回一个Promise(您可以在这里看到:https : //github.com/angular/angular.js/blob/master/src/ng/q.js#L283)。您可以通过查看Promise(一个简单的对象) 已从 函数中 拉出 并分配给来描述此情况vm.feed。一旦解释器执行该行,就会发生这种情况。
then()
vm.feed
由于成功的回调不会在您调用then()时运行,而只会在您的诺言得到解决(稍后,异步)时运行,因此无法为then()调用者返回其值。这是Javascript的默认工作方式。这就是引入Promises的确切原因,因此您可以要求解释器以回调的形式将值 推 送给您。
尽管在JavaScript的未来版本(ES2016)上,将引入几个关键字,这些关键字几乎可以满足您现在的期望。好消息是,您可以通过从ES2016到当前广泛支持的版本(ES5)的转换,立即开始编写这样的代码。
有关该主题的详细介绍,请访问:https://www.youtube.com/watch?v = lil4YCCXRYc
要立即使用它,您可以通过Babel转换代码:https ://babeljs.io/docs/usage/experimental/ (通过运行--stage 1)。
--stage 1
您还可以在这里看到一些示例:https : //github.com/lukehoban/ecmascript- asyncawait。