【发布时间】:2020-01-07 15:30:02
【问题描述】:
我有两个 .js 文件,例如:
index.js:
app.get("/testing", (req, res) => {
testAsyncFunction().then((resolvedData) => {
res.send(resolvedData);
});
})
和 server.js:
const asyncFunction = () => {
return new Promise((res) => {
setTimeout(() => {
res('resolved');
},3000 )
})
}
const testAsyncFunction = () => {
return new Promise(async (res) => {
const result = await asyncFunction();
return res(result);
})
}
这是按预期工作的,但如果我将 testAsyncFunction(这样我不会创建新的承诺)更改为这样的:
const testAsyncFunction = async () => {
const result = await asyncFunction();
return result;
}
在 index.js 中:
app.get("/testing", (req, res) => {
res.send(testAsyncFunction());
})
我得到一个空对象,因为它没有等待 3 秒,在后一种情况下我错过了什么?我想避免创建一个新的 Promise 只是为了等待另一个 Promise。
更新
我把 testAsyncFunction 改成这样:
const testAsyncFunction = () => {
asyncFunction().then((result) => {
return result;
})
}
即使上面的功能。不是异步函数,为什么我仍然必须在index.js 中等待它。我假设在这种情况下返回的值不会是一个承诺,所以这就是我感到困惑的部分。
【问题讨论】:
-
我认为在这种情况下,您无法避免在
app.get()回调中“创建另一个承诺”。您可以使用async/await隐藏它。 -
@RameshReddy
async总是将你的返回值包装成一个承诺 -
如果我每次重复这句话都能得到五分钱,我会很富有 - "Every
async函数返回一个承诺。你必须使用.then()或await在来自async函数的返回值上以获取解析值。" -
一旦在函数的任何地方异步获得结果(如通过promise),那么将其返回给调用者的唯一方法就是异步(通常通过promise)。您可以直接返回承诺或使用
async函数并让 JS 为您做出承诺。但是,无论哪种方式,您都将返回一个 Promise,而调用者将使用.then()或await从 Promise 中获取值。这就是异步代码和承诺在 Javascript 中的工作方式。 -
@jfriend00 “将它返回给调用者的唯一方法是异步(通常通过承诺)”这终于消除了我的疑问。我希望你能找到大量的镍币并变得富有。
标签: javascript promise es6-promise