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

时间:2015-07-07 09:01:32

标签: javascript 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秒后复制了v..ed的console.log:

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

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

谢谢你!

5 个答案:

答案 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);