承诺加数字返回承诺

时间:2018-02-12 12:51:48

标签: javascript promise type-conversion

我有一个简单的代码

async function foo() {
  const b = bar()
  return 2 + b
}

async function bar() {
  return 2
}

(async() => {
  console.log(typeof foo())
})()

并记录object。不是NaN。如何number + object - > object

从我记得的+规范中,如果其中一个操作数是基元,第二个是对象,那么对象应该转换为基元。在这种情况下使用.valueOf()方法

2 个答案:

答案 0 :(得分:1)

它认为这是因为async函数尚未解决,因为没有await。所以你得到了承诺对象而不是结果。

看这些案例:

async function foo () {
    const b = await bar() //await result
    return 2 + b
}

async function bar () {
    return 2
}

;(async () => {
    console.log(typeof await foo()) //number
})()

async function foo () {
    const b = bar() //no await
    return 2 + b
}

async function bar () {
    return 2
}

;(async () => {
    console.log(typeof await foo()) //string
})()

答案 1 :(得分:0)

函数foobar返回一个promise,所以,你得到了promise类型(Object)

您可能希望比较结果,因此您需要等待承诺解决连接:

let result = await foo();
             ^

async function foo() {
  const b = bar() // Here you need to wait as well.
  return 2 + b; // 2 + "[object Promise]"
}

async function bar() {
  return 2
}

(async() => {
  let result = await foo();
  console.log(result);
  console.log(typeof result);
})()

现在,要获取NaN值,您需要转换为数字:

async function foo() {
  const b = bar();  // Here you need to wait as well.
  return Number(2 + b); // <- Try to conver to number
}

async function bar() {
  return 2
}

(async() => {
  let result = await foo();
  console.log(result);
  console.log(typeof result);
})()