从Promise返回 then()

IT技术 javascript promise
2021-01-24 21:53:44

我有一个这样的javascript代码:

function justTesting() {
  promise.then(function(output) {
    return output + 1;
  });
}

var test = justTesting();

我的 var 测试总是有一个未定义的值。我认为这是因为Promise尚未解决……有没有办法从Promise中返回值?

6个回答

当你从then()回调中返回一些东西时,这有点神奇。如果您返回一个值,then()则使用该值调用next 但是,如果您返回类似 promise 的内容,则 nextthen()会等待它,并且仅在该 promise 解决(成功/失败)时调用。

来源:https : //web.dev/promises/#queuing-asynchronous-actions

似乎是因为这个原因,然后我可以在stackoverflow.com/q/53651266/2028440 中使用 Ajax 请求同步迭代数组的Promise链
2021-03-21 21:53:44
但是 Promise.all 如何捕获每个已解决的 Promise 的返回值?
2021-03-28 21:53:44
相关链接
2021-04-06 21:53:44

要使用Promise,您必须调用一个创建Promise的函数,或者您必须自己创建一个。你并没有真正描述你真正想要解决的问题,但这里是你自己创建Promise的方法:

function justTesting(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

justTesting(29).then(function(val) {
   // you access the value from the promise here
   log(val);
});

// display output in snippet
function log(x) {
    document.write(x);
}

或者,如果您已经有一个返回Promise的函数,您可以使用该函数并返回其Promise:

// function that returns a promise
function delay(t) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, t);
  });
}

function justTesting(input) {
  return delay(100).then(function() {
    return input + 10;
  });
}

justTesting(29).then(function(val) {
  // you access the value from the promise here
  log(val);
});

// display output in snippet
function log(x) {
  document.write(x);
}

让我失望的是双重的return,即justTestingreturn.then => return我知道这是可行的 bcs 我已经实现了这个(bcs linting 迫使我远离new Promise),但是你能解释一下如何理解/思考那个返回/返回对吗?
2021-03-25 21:53:44
伙计解释得很清楚。谢谢你。
2021-04-02 21:53:44
@RonRoyston - 首先,你传递给的函数.then()是一个独立于包含函数的函数,所以当它被调用时,它有自己的返回值。其次,.then()处理程序的返回值成为Promise的解析值。因此,.then(val => {return 2*val;})正在将解析值从 更改val2*val
2021-04-08 21:53:44

我在这里所做的是我从 justTesting 函数返回了一个Promise。然后,您可以在解析函数时获得结果。

// new answer

function justTesting() {
  return new Promise((resolve, reject) => {
    if (true) {
      return resolve("testing");
    } else {
      return reject("promise failed");
   }
 });
}

justTesting()
  .then(res => {
     let test = res;
     // do something with the output :)
  })
  .catch(err => {
    console.log(err);
  });

希望这可以帮助!

// old answer

function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }
好吧,这正是我所期望的,我只是想确定一下 :) 谢谢!
2021-03-14 21:53:44
如果在“//do something with the output”我放了一个 return 语句会发生什么?例如:我会在父函数中使用“JustTesting().then...”。我能在“then”部分返回一个值吗?
2021-04-07 21:53:44
如果你想从 //do something 的输出中返回一个值,你必须在 justTesing() 之前添加一个返回值。例如," return justTesting().then((res) => { return res; });
2021-04-07 21:53:44

我更喜欢使用“await”命令和异步函数来摆脱Promise的混乱,

在这种情况下,我将首先编写一个异步函数,这将用于代替在此问题的“promise.then”部分下调用的匿名函数:

async function SubFunction(output){

   // Call to database , returns a promise, like an Ajax call etc :

   const response = await axios.get( GetApiHost() + '/api/some_endpoint')

   // Return :
   return response;

}

然后我会从主函数调用这个函数:

async function justTesting() {
   const lv_result = await SubFunction(output);

   return lv_result + 1;
}

请注意,我在这里将主函数和子函数都返回给了异步函数。

完美,但是如果服务失败了怎么办?它会返回Promise吗?
2021-03-18 21:53:44
嗨@minigeek,您应该将 await 命令放在 TRY-CATCH 块之间,如下所示: try { const lv_result = await SubFunction(output); } catch (error) { console.log("读取图像时出错", error); }
2021-03-21 21:53:44
它尝试过,但没有用,所以我最终返回了Promise本身,哈哈
2021-03-26 21:53:44
对...使用 await 使它更干净并解决了问题
2021-03-31 21:53:44

Promises 不要“返回”值,它们会将它们传递给回调(您通过 .then() 提供)。

它可能是想说你应该resolve(someObject);在 promise 实现中

然后在你的then代码中你可以参考someObject做你想做的事。