承诺待定

我的代码:

let AuthUser = data => { return google.login(data.username, data.password).then(token => { return token } ) } 

而当我尝试运行这样的东西:

 let userToken = AuthUser(data) console.log(userToken) 

我越来越:

 Promise { <pending> } 

但为什么?

我的主要目标是将google.login(data.username, data.password)令牌返回给一个variables。 只有这样才能做出一些行动。

只要结果还没有解决,承诺就会一直logging下来。 无论承诺状态如何(已解决或仍在审批中),您必须致电。然后根据承诺获取结果:

 let AuthUser = function(data) { return google.login(data.username, data.password).then(token => { return token } ) } let userToken = AuthUser(data) console.log(userToken) // Promise { <pending> } userToken.then(function(result) { console.log(result) //will log results. }) 

这是为什么?

承诺只是向前的方向,你只能解决一次,你只能得到他们的价值传递给.then / .catch

细节

在评论部分有一个误解,关于一个答案的回答只能回到它的function,最终什么也不做。 .then(token => { return token; })

引用是(是为了确保没有人认为这是正确的)

最终你的callback令牌=> {return token; } 什么也没做; 相反,您对then()的input需要是以某种方式实际处理令牌的函数。

根据Promises / A +规范:

承诺解决程序是一个抽象的操作,将input的承诺和价值作为input,我们表示为[[parsing]](承诺,x)。 如果x是一个可接受的,它假设承诺采用x的状态,假设x的行为至less有点像一个承诺。 否则,它用x来履行诺言。

这种对可执行文件的处理允许promise实现互操作,只要它们公开Promise / A +遵循的方法即可。 它还允许Promises / A +实现用合理的方法“吸收”不一致的实现。

这个实现细节有点难以parsing,所以让我们分解一下。

规则是,如果处理程序中的函数返回一个值,那么promise将使用该值来parsing/拒绝,如果函数返回一个promise,那么接下来的then子句将成为promise的then子句函数返回,所以在这种情况下,第一个例子按照thens的正常顺序落下,打印出你想要的值,在第二个例子中,当你做Promise.resolve(“bbb “)则是链接时调用的那个(为了所有的意图和目的)。 它的实际工作方式在下面更详细地描述。

.then函数的返回将是promise的parsing值。

例:

 function initPromise() { return new Promise(function(res,rej) { res("initResolve"); }) } initPromise().then(function(result) { console.log(result); // "initResolve" return "normalReturn"; }) .then(function(result) { console.log(result); // "normalReturn" }); 

2.如果.then函数返回一个promise,那么它的promise的解决方法基本上就是下一个。

例:

 function initPromise() { return new Promise(function(res,rej) { res("initResolve"); }) } initPromise().then(function(result) { console.log(result); // "initResolve" return new Promise(function(resolve, reject) { setTimeout(function() { resolve("secondPromise"); }, 1000) }) }) .then(function(result) { console.log(result); // "secondPromise" }); 

请参阅承诺上的MDN部分。 特别的,看看then()的返回types。

要login,用户代理必须向服务器提交请求并等待接收响应。 由于在往返请求期间使应用程序完全停止执行通常会导致用户体验不佳,因此几乎每个将您login(或执行任何其他forms的服务器交互)的JS函数都将使用Promise或非常类似于,asynchronous传递结果。

现在,还要注意, return语句总是在它们出现的函数的上下文中进行评估。所以当你写下:

 let AuthUser = data => { return google .login(data.username, data.password) .then( token => { return token; }); }; 

声明return token; 意味着传递给then()的匿名函数应该返回该令牌,而不是AuthUser函数应该返回的。 什么AuthUser返回是调用google.login(username, password).then(callback); ,这恰好是一个承诺。

最终你的callbacktoken => { return token; } token => { return token; }什么都不做; 相反,您对then()input需要是以某种方式实际处理令牌的函数。

then方法返回一个挂起的promise,它可以被调用中注册的结果处理程序的返回值asynchronousparsing,或者在调用的处理程序中抛出错误而被拒绝。

因此,调用AuthUser不会突然以同步方式login用户,而是返回一个承诺,然后在login成功(或失败)后调用注册的处理程序。 我build议通过login承诺的then子句触发所有的login处理。 EG使用命名函数来突出显示stream程的顺序:

 let AuthUser = data => { // just the login promise return google.login(data.username, data.password); }; AuthUser(data).then( processLogin).catch(loginFail); function processLogin( token) { // do logged in stuff: // enable, initiate, or do things after login } function loginFail( err) { console.log("login failed: " + err); }