Javascript 承诺。内心的决心。然后给我未定义的
我不知道为什么我的Javascript 承诺。内心的决心。然后给我未定义的,javascript,promise,Javascript,Promise,我不知道为什么我的承诺.resolve返回未定义 我的代码结构如下: const request = require('request-promise') var lotteryid = function(){ const option = {/* info about the request url */} request(option) .then(function(body){ // do something // get some value from
承诺.resolve
返回未定义
我的代码结构如下:
const request = require('request-promise')
var lotteryid = function(){
const option = {/* info about the request url */}
request(option)
.then(function(body){
// do something
// get some value from the body. let's call it x
return promise.resolve(x)
})
.catch(function(err){
// got any error
return promise.reject(err)
})
}
完成此操作后,我调用此函数:
lotteryid.then(function(x){
**x is undefined in my case**
}).catch(function(err){
return promise.reject(err)
})
有人能帮我吗?谢谢第一个错误:不是
promise.resove
而是promise.resolve
第二个问题:在非异步函数中等待,然后返回已解决的承诺
编辑:更好的解决方案(感谢@Mikael Lennholm)
和以前一样:
lotteryid.then(function(x) {
// do_something(x)
})
.catch(function(err) {
// console.error(err)
})
旧答案:你可以:
const request = require('request-promise')
var lotteryid = function() {
return new Promise((resolve, reject) => {
request(option)
.then(function(body) {
// do something
// get some value from the body. let's call it x
resolve(x)
})
.catch(function(err){
// got any error
reject(err)
})
})
}
const request = require('request-promise')
var lotteryid = async function() {
request(option)
.then(function(body) {
// do something
// get some value from the body. let's call it x
return x
})
}
感谢Derek的建议。“我的代码结构是这样的”-不会编译。显示真实的。您的代码存在一些问题。首先,您没有从
lotteryid
返回任何内容,因此您试图附加的任何代码都被置若罔闻。“在我的情况下,x是未定义的”-您确定它不是那么哪个是未定义的?您可以摆脱返回承诺。解决(x)
,只需执行返回x
,也可以删除catch部分。您的lotteryId()
函数从不返回任何内容。你需要返回你从得到的承诺。然后()
。这看起来像是一种反模式,你可以使用返回请求(选项)…
而不是开始如果我理解Rikenm在返回前必须做些什么的意思://做些什么
//从身体获得一些价值。让我们称之为x
即使如此,你还是在回报一个承诺的承诺。“只返回最初的承诺更有意义,你可以做与反模式相同的事情,是吗?”阿尔多。您可以在然后
回调中执行任何需要执行的操作:返回请求(选项)。然后(函数(body){/*从body获取一些值。我们称之为x*/return x})
。这就是承诺应该如何使用,以及为什么您的解决方案是反模式的。简而言之,如果你已经从你调用的函数中得到了一个承诺,你永远不需要创建你自己的承诺。如果我像你说的那样删除.catch(),我应该在哪里捕获它。
const request = require('request-promise')
var lotteryid = async function() {
request(option)
.then(function(body) {
// do something
// get some value from the body. let's call it x
return x
})
}