是否可以从then()返回一个值?

时间:2018-05-13 22:25:03

标签: javascript promise es6-promise

我已经读过,当你从then()返回一个值时,它被包装在一个Promise中并作为一个promise被返回。有没有办法只返回一个值而不是一个promise对象?

function TestPromise() {
  //someAsyncFunction returns a Promise.
  return someAsyncFunction();
}

//Assume valueFromPromise = 2;
//After the addition newValue becomes 3
//And we return 3 instead of 3 wrapped up in a Promise.

function someFunction() {
  return latestValue = TestPromise().then(valueFromPromise => {
     newValue = valueFromPromise + 1;
     return newValue;
  });
}
function main() {
  let value = someFunction();
  //Use value here to do something.
}

我知道我要问的是可以通过async / await来实现。但我想正确理解Promises。

由于

2 个答案:

答案 0 :(得分:1)

可能有助于了解幕后发生的事情。承诺实际上只是围绕旧回调的语法糖。

function TestPromise() {
  //someAsyncFunction returns a Promise.
  return someAsyncFunction();
}

function someAsyncFunction() {
    return new Promise(function(resolve, reject) {
        fetchSomeValue()
            .then(function(someValue) {
                resolve(someValue);
            });
}

Promise调用resolve()回调之前,无法获取该数据。 async/await真的很干净,我不确定你为什么要避免它。

function TestPromise() {
  //someAsyncFunction returns a Promise.
  return someAsyncFunction();
}

//Assume valueFromPromise = 2;
//After the addition newValue becomes 3
//And we return 3 instead of 3 wrapped up in a Promise.

async function someFunction() {
  const valueFromPromise = await TestPromise();
  return valueFromPromise + 1;
}

async function main() {
  let value = await someFunction();
  //Use value here to do something.
}

答案 1 :(得分:0)

标题中问题的简短回答:

没有与vanilla承诺,与异步等待。

答案很长:

TestPromise()生成的值只能在使用vanilla Promises时在后续.then.catch内访问。

then本身每次调用时都会创建并返回Promise Object,因此您可以将每个then的Promise解析分开。

说:



const p = new Promise((resolve) => {
  setTimeout(() => resolve(1), 2000);
}).then((val) => {
  console.log(val);
  return new Promise((resolve) => {
    setTimeout(() => resolve(2), 1000);
  })
}).then((val) => {
  console.log(val);
  return 3
});

p.then(console.log);



  

Async/Await只是PromisesGenerators的糖,它会为您执行上述操作并解除承诺值并将其传递给您:

async function someFunction() {
  const valueFromPromise = /* here it passes the unwrapped value back  after await */await TestPromise();
  return valueFromPromise + 1;
}

但仍然异步函数本身是一个承诺,所以你必须接收它的值,或者将另一个then附加到async函数,如下所示:

someFunction().then(finalValue => console.log(finalValue)

或在另一个异步函数中再次使用它,并通过这样的await展开:

async function outerAsyncFunction() {
  const finalValue = await someFunction();
  console.log(finalValue);
}