小编典典

将成功的诺言解析中的值分配给外部变量

angularjs

我有一个很傻的问题。考虑以下:

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秒后,我复制了vm.feed的console.log:

Promise {$$state: Object} $$state: Objectstatus:1 value: Object

Promise对象中的value属性包含要分配给vm.feed(ei data)的Promise的实际解决方案。

谢谢!


阅读 212

收藏
2020-07-04

共1个答案

小编典典

您的发言确实不外乎要求解释分配从返回的值then()vm.feed变量。then()返回一个Promise(您可以在这里看到:https
:
//github.com/angular/angular.js/blob/master/src/ng/q.js#L283)。您可以通过查看Promise(一个简单的对象)
已从 函数中 拉出 并分配给来描述此情况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)。

您还可以在这里看到一些示例:https :
//github.com/lukehoban/ecmascript-
asyncawait。

2020-07-04