在另一个承诺中解决承诺
Resolve promise inside another promise
我是 promise 的新手,在掌握如何将两个 promise 组合在一起时遇到了一些困难。我有一个函数可以解决承诺并执行一些任务:
loginService (context, credentials) {
context.$http.post(LOGIN_URL, credentials, { emulateJSON: true}).then(response => {
this.user.authenticated = true
localStorage.setItem(TOKEN_STORAGE_NAME, response.body[TOKEN_NAME])
}).catch(response => {
context.error = response.body
})
},
我想修改上面的代码,这样我就可以执行如下操作:
login () {
this.submitButtonLoading = true
loginService(this, this.credentials).then(response => {
this.submitButtonLoading = false
// Do something else here.
}).catch(response => {
this.submitButtonLoading = false
// Do something else here.
})
}
处理这个问题的正确方法是什么?
Return 来自 loginService
的承诺,然后你可以继续链接:
loginService (context, credentials) {
return context.$http.post(LOGIN_URL, credentials, { emulateJSON: true})
.then(response => {
this.user.authenticated = true
localStorage.setItem(TOKEN_STORAGE_NAME, response.body[TOKEN_NAME])
})
.catch(response => {
context.error = response.body
})
}
login () {
this.submitButtonLoading = true
loginService(this, this.credentials)
.then(_ => {
this.submitButtonLoading = false
// ...
})
}
注意login
中的then()
函数无论调用成功与否,都会一直执行
要使 loginService 成为一个承诺,只需 return 一个 Promise
函数内部。确保在函数完成时调用 resolve
and/or reject
。
在您的示例中,您可以:
var loginService = function(context, credentials) {
return new Promise( (resolve, reject) => {
context.$http.post(LOGIN_URL, credentials, {emlateJSON: true})
.then(response => {
if (success) {
this.user.authenticated = true
resolve(this.user)
} else {
reject(new Error('Log in failed'))
}
})
.catch(err => {
reject(err)
})
})
}
现在是then-able。
注意整个函数实际上只是 return 一个大 Promise。还要注意如何解决或拒绝成功或失败。
我是 promise 的新手,在掌握如何将两个 promise 组合在一起时遇到了一些困难。我有一个函数可以解决承诺并执行一些任务:
loginService (context, credentials) {
context.$http.post(LOGIN_URL, credentials, { emulateJSON: true}).then(response => {
this.user.authenticated = true
localStorage.setItem(TOKEN_STORAGE_NAME, response.body[TOKEN_NAME])
}).catch(response => {
context.error = response.body
})
},
我想修改上面的代码,这样我就可以执行如下操作:
login () {
this.submitButtonLoading = true
loginService(this, this.credentials).then(response => {
this.submitButtonLoading = false
// Do something else here.
}).catch(response => {
this.submitButtonLoading = false
// Do something else here.
})
}
处理这个问题的正确方法是什么?
Return 来自 loginService
的承诺,然后你可以继续链接:
loginService (context, credentials) {
return context.$http.post(LOGIN_URL, credentials, { emulateJSON: true})
.then(response => {
this.user.authenticated = true
localStorage.setItem(TOKEN_STORAGE_NAME, response.body[TOKEN_NAME])
})
.catch(response => {
context.error = response.body
})
}
login () {
this.submitButtonLoading = true
loginService(this, this.credentials)
.then(_ => {
this.submitButtonLoading = false
// ...
})
}
注意login
中的then()
函数无论调用成功与否,都会一直执行
要使 loginService 成为一个承诺,只需 return 一个 Promise
函数内部。确保在函数完成时调用 resolve
and/or reject
。
在您的示例中,您可以:
var loginService = function(context, credentials) {
return new Promise( (resolve, reject) => {
context.$http.post(LOGIN_URL, credentials, {emlateJSON: true})
.then(response => {
if (success) {
this.user.authenticated = true
resolve(this.user)
} else {
reject(new Error('Log in failed'))
}
})
.catch(err => {
reject(err)
})
})
}
现在是then-able。
注意整个函数实际上只是 return 一个大 Promise。还要注意如何解决或拒绝成功或失败。