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

标签 javascript ecmascript-6 promise

我想知道在另一个 promise 解决后调用 promise 的正确方法是什么。我知道我们可以使用 async await 来创建解决 promise 的函数。我想知道哪种形式的处理 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();

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();

最佳答案

两者都可以。你的选择。

首先,您要嵌套 .then() 处理程序。在第二个中,您使用较新的 await 对它们进行排序。越来越多的人转向 await,因为它似乎是用于排序操作的更简单的代码(假设您进行了适当的错误处理),尽管在这种情况下,它们的复杂性非常相似,尤其是下面建议的简化所以这完全取决于您自己的个人编码风格。

两者都缺少的是 get() 只是返回了一个 promise,因此您需要使用 .then().catch() 用它来获取值并捕获任何错误。

此外,第一个中缺少的东西是您没有返回第二个 promise ,这意味着调用者不知道第二个操作何时完成。

您的第一个可以像这样简化和修复:

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

get().then(val => {
   // done here
}).catch(err => {
   // error here
});

正如 Pointy 所提到的,您不会“调用 promise ”。您“调用一个返回 promise 的函数”。 promise 是对象。它们不可调用。

可能您的标题可以重写为:“对每个返回 promise 的两个异步操作进行排序的正确方法”


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

你可以使用 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;
  });
}

关于javascript - 排序两个异步操作的正确方法,每个异步操作返回一个 promise javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51690711/

相关文章:

javascript - 在 Spring MVC 元素中找不到几个 css 和 js 文件的消息页面

javascript - 如何以编程方式触发 JqGrid 中特定网格行的单击事件

javascript - ES6,在访问 'this'并在派生类中定义常量之前必须调用super

node.js - Node 7.1.0 新的 Promise() 解析器 undefined 不是函数

javascript - 同时完成子进程和 Promise 决议

javascript - JSHint、For 循环、Promises 和一个讨厌的 lint 错误

javascript - Android webView 禁用维基百科搜索栏

javascript - FirebaseError browserErrorMessage : "Failed to register a ServiceWorker: ServiceWorker script evaluation failed"

node.js - ES6 - 并行向多个用户帐户发出多个请求

javascript - 如何检测何时在 javascript 中设置了全局变量?