我一直试图了解异步/等待的工作原理,我要做的就是让它等待直到返回值。但是,我无法通过回调,promise或async/await
做到这一点。我在做什么错,为什么async/await
不能正常工作? (等待运行其他代码,直到实现此承诺为止)
像这样的许多问题都链接到“简介页面”。我已经阅读了所有内容,了解了它们的功能,只是不知道如何正确地将它们写出,因为我相信我做的一切正确,我只是缺少了一些东西
console.log("xcdcxcxcxccxvccvffdgfcd")
;
thing();
async function thing() {
let c = await otherthing();
console.log("dfasfadsfdasasdfa" + c)
}
async function otherthing() {
await setTimeout(function() {
return new Promise((resolve, reject) => {
let f = "rerewwqfewfasgsadf"
return resolve(f);
})
}, 3000);
}
console.log
应该等待,直到返回承诺值c
,但是,它似乎不起作用。为什么?
答案 0 :(得分:4)
异步/等待与返回承诺的函数一起使用。您的otherthing
函数不会返回任何内容。
您可以通过返回实例化的Promise来修复代码,如下所示:
thing();
async function thing() {
let c = await otherthing();
console.log("dfasfadsfdasasdfa" + c)
}
function otherthing() {
return new Promise((resolve, reject) => {
setTimeout(function () {
let f = "rerewwqfewfasgsadf"
resolve(f);
}, 3000)
});
}
答案 1 :(得分:3)
您必须从return
函数而不是new Promise
回调中otherthing
setTimeout
。您应该构造承诺,在其执行程序回调中启动异步操作(setTimeout
),然后异步resolve()
或reject()
承诺。
function otherthing() {
return new Promise((resolve, reject) => {
setTimeout(function(){
let f = "rerewwqfewfasgsadf"
resolve(f);
}, 3000);
});
}
对于该函数,您实际上不需要任何async
/ await
,而该函数实际上只是setTimeout
周围的一个承诺包装。另请参见How do I convert an existing callback API to promises?。
答案 2 :(得分:2)
您应该将setTimeout
移到Promise
内,然后resolve(f)
function otherthing() {
return new Promise((resolve, reject) => {
setTimeout(() => {
let f = "rerewwqfewfasgsadf"
resolve(f);
}, 3000);
});
}
答案 3 :(得分:0)
async function otherthing
没有return
语句,因此它将始终返回解析为undefined
的Promise。
await setTimeout(...)
没有任何意义。您只能await
个承诺,setTimeout
不返回承诺。
您需要明确:
new Promise()
内创建一个otherthing
resolve()
在传递给setTimeout
的回调函数中具有所需的值return
来自otherthing
的承诺不要在传递给setTimeout
的回调函数中创建Promise。那里没有意义。