正确的方法来排序每个返回promise javascript的两个异步操作

hjm*_*hjm 4 javascript promise ecmascript-6

我想知道在另一个承诺解决之后调用承诺的正确方法是什么.我知道我们可以使用async await来创建解析promise的函数.我想知道哪种形式的处理承诺是正确的做法,或者是创建发电机的好习惯?考虑以下代码:

const fetchSomething = () => new Promise((resolve) => {
  setTimeout(() => resolve(console.log('future value')), 500);
});

const fetchSomethingElse = () => new Promise((resolve) => {
  setTimeout(() => resolve(console.log('future value dueeee')), 3000);
});


const get = () => {
  return fetchSomething().then(function(){
    fetchSomethingElse()
  });
}
get();
Run Code Online (Sandbox Code Playgroud)

要么

const fetchSomething = () => new Promise((resolve) => {
  setTimeout(() => resolve({resolve: true}), 500);
});

const fetchSomethingElse = () => new Promise((resolve) => {
  setTimeout(() => resolve({resolve: true}), 3000);
});


const get = async function() {
  const fet = await fetchSomething();
  const fet2 = await fetchSomethingElse();
};

get();
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 5

任何一个都没问题.你的选择.

在第一个你是嵌套.then()处理程序.在第二个中,您使用较新await的序列来对它们进行排序.越来越多的人开始使用await它,因为它似乎是更简单的排序操作代码(假设你做了正确的错误处理),虽然在这种情况下,它们的复杂性非常相似,特别是下面建议的简化,所以这取决于你自己的个人编码风格.

两者中缺少的是get()只返回一个promise,所以你需要使用它.then().catch()使用它来获取值并捕获任何错误.

另外,第一个缺少的是你没有返回第二个promise,这意味着调用者不知道第二个操作何时完成.

你的第一个可以简化和修复如下:

const get = () => {
  return fetchSomething().then(fetchSomethingElse);
}

get().then(val => {
   // done here
}).catch(err => {
   // error here
});
Run Code Online (Sandbox Code Playgroud)

正如Pointy所说,你不是"做出承诺".你"调用一个返回一个承诺的函数".承诺是对象.他们不可赎回.

你的标题可能被重写的可能是:"正确的方法来排序每个返回一个承诺的两个异步操作".


为了完整起见,如果您的两个异步操作不相互依赖,则您不必手动对它们进行排序.您可以启动它们,然后监视何时完成.这有时会得到更快的端到端响应.

你可以这样做Promise.all():

const get = function() {
  return Promise.all([fetchSomething(), fetchSomethingElse()]).then(results => {
    // process results array and then return final value
    // results[0] is result from fetchSomething, results[1] is result from fetchSomethingElse
    return finalVal;
  });
}
Run Code Online (Sandbox Code Playgroud)