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
        })
    }