我的代码:
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)
中的token转换为一个变量。然后才预形成一些动作。
我知道这个问题是两年前提出的,但我遇到了同样的问题,问题的答案是自ES2017以来,您可以简单地await
函数返回值(到目前为止,仅适用于async
函数),例如:
let AuthUser = function(data) {
return google.login(data.username, data.password).then(token => { return token } )
}
let userToken = await AuthUser(data)
console.log(userToken) // your data
只要其结果尚未解决,该承诺将始终记录为挂起状态。您必须调用promise上的。然后
以捕获结果,而不管promise状态(已解决或仍挂起):
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) // "Some User token"
})
这是为什么?
承诺只是前进的方向;只能解决一次。promise
的解析值将传递给其.then
或.catch
方法。
根据承诺/A+规范:
promise resolution过程是一个抽象操作,将promise和一个值作为输入,我们将其表示为[[Resolve]](promise,x)。如果x是一个许诺,它试图使许诺采用x的状态,前提是x的行为至少有点像一个许诺。否则,它将用值x实现承诺。
对TheEnables的这种处理允许promise实现互操作,只要它们公开一个符合Promission/a+的then方法。它还允许Promission/A+实现用合理的then方法“同化”不符合的实现。
这个规范有点难解析,所以让我们把它分解一下。规则是:
如果.then
处理程序中的函数返回一个值,则promise
使用该值进行解析。如果处理程序返回另一个promise
,则原始promise
将使用链接的promise
的解析值解析。下一个.then
处理程序将始终包含在前一个.then
中返回的链接承诺的解析值。
下面将更详细地介绍它的实际工作方式:
1..then
函数的返回将是承诺的解析值。
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
函数返回一个承诺
,则将该链接承诺的解析值传递给下面的.then
。
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"
});
问题内容: 我的代码: 当我尝试运行这样的东西时: 我越来越: 但为什么? 我的主要目标是将令牌(从令牌中返回承诺)转换为变量。然后才执行一些操作。 问题答案: 只要其结果尚未解决,promise将始终记录未决。无论promise状态如何(已解决或仍处于待处理状态),您都必须调用promise来捕获结果: 这是为什么? 承诺只是向前的方向;您只能解决一次。a的解析值传递给其或方法。 根据Promi
我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语
我有一个异步函数,它调用其中的另一个异步函数。此异步函数正在返回" 你能帮我解决这个问题吗? 以下是第一个异步函数: 如你所见,我调用updateAllProducts函数,并将该值存储到一个变量调用newAllProducts. updateAllProducts是另一个异步函数。 以下是updateAllProducts的代码: 此updateAllProducts函数正在调用另一个异步函数调
我正在学习react native,我遇到了一个问题。为什么从异步函数返回时获取数据会返回一个promise,但在异步函数本身中,它会正确地返回一个对象数组? 在上,我调用我的异步函数,该函数反过来提取api url: 在,我得到了正确的json对象列表,我可以使用。但后来,返回包含奇数数据的promise: ... 我再也找不到我的json对象了。为什么会这样?更重要的是,如何在中检索json数
考虑以下代码: 这是我得到的输出: 但是如果我把代码改成这样: 我会得到这个: 我很困惑,因为根据文档,应该暂停执行,直到promise得到解决。在这种情况下,第一个示例应该以数组的形式返回
我刚刚发现,在react函数都是异步的,或者在调用它的函数完成后调用。 现在这两样东西很难消化 在博客中,函数是在函数内部调用的,但是触发函数的原因并不是被调用函数所知道的。 他们为什么要让异步,因为JS是单线程语言,而且这个setState不是WebAPI或服务器调用,所以只能在JS的线程上完成。他们这样做是为了使重新呈现不会停止所有事件侦听器和其他东西,还是有其他设计问题。