我有一个像这样的函数调用:
await someFunction(foo);
将someFunction
定义为:
const someFunction = foo => {
return new Promise((resolve, reject) => {
if (foo) {
return resolve(someOtherPromise());
}
reject();
}
}
这是有效的代码吗?我已经测试过了,看起来还可以。
如果await someFunction()
为await someOtherPromise()
,foo
将转换为true
是否正确,即它将继续等待someOtherPromise
解决吗?
答案 0 :(得分:4)
是的,它是有效的代码,可以by resolving with a promise使用,但闻起来像Promise
constructor antipattern。我反而建议写
function someFunction(foo) {
if (foo)
return someOtherPromise();
else
return Promise.reject();
}
或
async function someFunction(foo) {
if (foo)
return someOtherPromise();
else
throw;
}
(最好在消息中抛出new Error
,而不是undefined
)
答案 1 :(得分:0)
我已经编写了一些测试代码以查看其是否正确:
const someFunction = foo => {
return new Promise((resolve, reject) => {
if (foo) {
return resolve(someOtherPromise(2000));
}
reject();
});
}
const someOtherPromise = async(ms) => {
return new Promise(resolve => setTimeout(() => {
console.log("i'm about to resolve in someOtherPromise");
resolve();
}, ms));
}
const run = async () => {
await someFunction('foo');
console.log('finished waiting for someFunction');
}
run();
答案 2 :(得分:0)
我已经编写了3个函数来对其进行测试。
c = () => new Promise((resolve, reject) => {
setTimeout(() => {
console.log('c');
resolve();
}, 1000);
});
b = () => new Promise((resolve, reject) => {
setTimeout(() => {
console.log('b');
resolve(c());
}, 1000);
});
a = async () => {
console.log('a before');
await b();
console.log('a after');
};
a();
我们可以看到,输出顺序为a before
,b
,c
,然后是a after
。因此,await
已经等待b
,并继续等待c
。