返回解析中的另一个aysnc函数

时间:2020-10-01 11:25:51

标签: javascript promise

我有一个像这样的函数调用:

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解决吗?

3 个答案:

答案 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 beforebc,然后是a after。因此,await已经等待b,并继续等待c

相关问题