我有一个异步函数sayHello()
,它在greeting()
函数内部调用:
function greeting() {
let P = new Promise();
sayHello().then(function(){
//manipulate DOM
P.resolve();
}).catch(function(error)){
//manipulate DOM
P.reject();
});
return P;
}
我希望greeting()
返回一个承诺,这样调用者就会知道sayHello
的工作何时完成。但是这段代码似乎并不正确,因为它表示Promise在构造时应该定义resolve
和reject
个函数。我该怎么办 ?
答案 0 :(得分:3)
只需返回Promise
返回的sayHello()
:
function greeting() {
return sayHello().then(function(){
//manipulate DOM
}).catch(function(error)){
//manipulate DOM
});
}
then
method返回一个承诺。
这是一个简单的fiddle来说明这一点。
答案 1 :(得分:0)
async function greeting() {
let response
try {
response = await sayHello()
} catch(err) {
response = err
}
return response
}
greeting().then(response => console.log(response))
function greeting2() {
return new Promise((resolve, reject) => {
sayHello().then(_ => {
//manipulate DOM
resolve()
}).catch(err => {
//manipulate DOM
reject()
})
})
}
greeting2().then(_ => console.log('something'))
答案 2 :(得分:0)
其他答案提供了很好的解决方案,但是您看到错误的实际原因是: Promise应该解析并拒绝构造时定义的函数。是您的特定Promise
实现使用。最新版本需要一个"执行者"在调用它时作为第一个参数:
new Promise(/* this is the executor: */ function (resolve, reject) { ... });
您可以在此处查看规范:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
较旧版本的Promise
未遵循相同的规范。