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

Ger*_*los 34 javascript angularjs

我有一个非常愚蠢的问题.考虑以下:

vm.feed = getFeed().then(function(data) {return data;});
Run Code Online (Sandbox Code Playgroud)

getFeed() 返回成功解析的$ q延迟承诺(我在角上).

我的目标是将vm.feed设置为等于成功回调返回的数据值.就像现在一样,代码只是将vm.feed赋予等于$promise返回的对象getFeed().

我知道我可以简单地做:vm.feed = data在已解决的函数内部,但我想理解为什么这段代码不能正常工作.

PD:promise正确解析,即使在解析后,vm.feed仍然等于Promise,而不是数据.我在+10秒后复制了console.log的vm.feed:

Promise {$$state: Object} $$state: Objectstatus:1 value: Object
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Sol*_*tos 20

可以使用箭头功能将其更新为ES6,如下所示:

getFeed().then(data => vm.feed = data);
Run Code Online (Sandbox Code Playgroud)

如果你想使用async function,你也可以这样做:

async function myFunction(){
    vm.feed = await getFeed();
    // do whatever you need with vm.feed below
 }
Run Code Online (Sandbox Code Playgroud)

  • 如果我想返回并导出 vm.feed 的值,并将其作为参数进一步传递到另一个 js 文件中的完全不同的函数中,该文件接受 String 类型的参数(假设:vm.feed 包含 String 类型的数据),该怎么办?这里返回 vm.feed 再次成为一个 Promise,所以我不能将它传递给该函数。我们有没有办法从 Promise 中检索数据并将其分配给一个变量以进一步用作非 Promise 对象? (2认同)
  • 感谢 Soldeplata 的回复!你是对的,但如果我从异步函数内部返回一个值,那么它又是一个 Promise。因此,我无法返回非承诺数据以在不同的函数中进一步使用。 (2认同)

Nat*_*han 19

您的发言确实没有什么比要求解释分配从返回的值更多then()的vm.feed变数.then()给你一个Promise(你可以在这里看到:https://github.com/angular/angular.js/blob/master/src/ng/q.js#L283).你可以通过看到Promise(一个简单的对象)被拉出函数并被分配给你来描绘这一点vm.feed.一旦解释器执行该行,就会发生这种情况.

由于成功回调在您调用时不会运行,then()但只有当您的promise得到解决时(稍后,异步),才能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.


Bha*_*avO 10

该then()方法返回一个Promise.它需要两个参数,都是Promise成功和失败案例的回调函数.promise对象本身并不直接为您提供已解析的数据,此对象的接口仅通过提供的回调提供数据.所以,你必须这样做:

getFeed().then(function(data) { vm.feed = data;});
Run Code Online (Sandbox Code Playgroud)

该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
Run Code Online (Sandbox Code Playgroud)

  • 我同意,但如果回调返回解析的数据本身,它不应该在 Promise 对象之外可用吗? (2认同)
  • 成功回调的返回值将传递到后续成功回调的成功回调中,从而使您可以沿调用链(责任链)传递变异值 (2认同)